openx广告管理系统pv机制分析及大流量网站的解决方案
首先监听广告投放页面,可以得到写pv所执行的页面url如下:
http://www.1sohu.com/www/deliver ... m&cb=8461ba7146
然后打印sql可以看出其执行的语句
INSERT INTO ox_data_bkt_m
(interval_start, creative_id, zone_id, count)
VALUES ('2011-10-28 02:00:00', '8', '5', '1')
ON DUPLICATE KEY UPDATE count = count + 1
查看表结构可以了解到是个复合主键,interval_start是只取到小时的日期, creative_id,zone_id对应具体广告单元,三个键发生重复时,则执行,对应的count+1
跟踪
http://www.1sohu.com/www/deliver ... m&cb=8461ba7146
得到被调入口函数,其位置是在/plugins/deliveryLog/oxLogImpression/logImpression.delivery.php
具体插入pv的入口方法
- function Plugin_deliveryLog_OxLogImpression_LogImpression_Delivery_logImpression($adId = 0, $zoneId = 0, $okToLog = true)
- {
- if (!$okToLog) { return false; }
- $aData = $GLOBALS['_MAX']['deliveryData'];
- $aQuery = array(
- 'interval_start' => $aData['interval_start'],
- 'creative_id' => $aData['creative_id'],
- 'zone_id' => $aData['zone_id']
- );
- return OX_bucket_updateTable('data_bkt_m', $aQuery);
- }
function Plugin_deliveryLog_OxLogImpression_LogImpression_Delivery_logImpression($adId = 0, $zoneId = 0, $okToLog = true) { if (!$okToLog) { return false; } $aData = $GLOBALS['_MAX']['deliveryData']; $aQuery = array( 'interval_start' => $aData['interval_start'], 'creative_id' => $aData['creative_id'], 'zone_id' => $aData['zone_id'] ); return OX_bucket_updateTable('data_bkt_m', $aQuery); }
当然大家测试可能发现对它的改动没有效果,实际上是缓存在作怪,清掉/var/cache下所有文件 ,即可看到效果。
对于大流量的优化,其实说实话,openx这个机制已经很完美了,除了高并发的执行大量insert or update之外,没什么大的压力,要解决这个就要用到memcached了,只要将其存入memcached中,用计划任务定时读取并写到库中即可,当然要记得插入库的时候,也要清掉对应的memcached数据,以节省资源,这样子一来,就完美了,并且我觉得,即使上千万的访问量,内存足够大,也足以应付了。
本站原创,转载请注明出处:
http://www.1sohu.com/newsHtm/58/n_16858.shtml