PHP+CMS+网站 · 2011年04月28号 0

OpenX的广告投放逻辑

广告调用过程中到底发生了什么?为什么我需要知道?这个问题很简单,虽然描述这个过程显得有些技术化,但是理解广告投放逻过程对于抓住广告投放逻辑至关重要,而且这个问题是理解其他OpenX主题的基础。

虽然下面描述的步骤主要针对OpenX2.8版本,但其步骤和早期版本差不多,只是以前的版本效率低一些而已。无论如何,基本的理念是一致的。

广告投放步骤
无论您使用何种广告代码,广告投放步骤都是一样的。经过一些环境初始化后,广告服务器使用下面的步骤来决定投放哪一个广告。

找到所有连接到该广告位的有效广告1。
是否有Contract(Exclusive)项目下的有效广告?如果有,则进入下面的步骤:
是否有Contract(Exclusive)项目下的广告超过了投放限制2?如果有,抛弃掉这些广告。
是否有Contract(Exclusive)项目下的广告和当前广告代码不相容3?如果有,抛弃掉这些广告。
还有广告剩下么?如果有,进入下面的步骤:
通过项目权重/广告权重步骤选择一个广告。(下面有详细说明)
使用所选广告ID和广告位ID记录一次请求。
显示广告。Display the banner.
使用所选广告ID和广告位ID记录一个PV日志。
如果当前点达到后,就不会有Contract(Exclusive)项目下的广告展现。
是否有Contract项目下的有效广告?如果有,进入下面的步骤:
是否有Contract项目下的广告超过了投放限制?如果有,抛弃掉这些广告。
是否有Contract项目下的广告和当前代码不相容?如果有,抛弃掉这些广告。
还有广告剩下么?如果有,进入下面的步骤:
随机Possibly 通过Contract项目广告投放步骤在这些广告中选择一个广告。(查看详情).
如果If 有广告被选择了:
使用所选广告ID和广告位ID记录一次请求。
显示广告。
使用所选广告ID和广告位ID记录一个PV日志。
如果当前点达到,就不会有Contract(Exclusive)项目下的广告可以展示,并且Contract项目下的广告也不会被展示。

是否有抄底项目下的有效广告?如果有,进入下面的步骤:
是否有抄底项目下的广告超过了投放限制?如果有,抛弃掉这些广告。
是否有抄底项目下的广告和当前代码不相容?如果有,抛弃掉这些广告。
还有广告剩下么?如果有,进入下面的步骤:
通过项目权重/广告权重步骤选择一个广告。(下面有详细说明)
使用所选广告ID和广告位ID记录一次请求。
显示广告。
使用所选广告ID和广告位ID记录一个PV日志。
如果当前点达到,则不会有Contract(Exclusive)项目下的广告可以展示,并且Contract项目下的广告也不会被展示,另外抄底项目下的广告也不会被展示。
当前广告为是否通过广告位链连接到其他广告位?如果是,则按照第一步以新广告位重新执行。
如果当前点达到,则不会有Contract(Exclusive)项目下的广告可以展示,并且Contract项目下的广告也不会被展示,另外抄底项目下的广告也不会被展示,而且该广告为没有通过广告位链连接到其他广告为。

是否设置了默认广告?如果有,进入下面的步骤:
使用所选广告ID和广告位ID记录一次请求。
显示广告。
使用所选广告ID和广告位ID记录一个PV日志。
如果当前点达到,则没有广告可以展现。
展示一个1×1的空白广告。
项目权重/广告权重处理步骤
在上述步骤中,当测试Contract(Exclusive)项目下的有效广告或者测试抄底项目下的有效广告时,如果有超过一个广告可以投放,则按照以下步骤来决定投放哪一个广告,不同的版本步骤会稍有不同:

OpenX 2.8.1以后版本
在广告位对应的所有广告里,找到其所属项目。
加和所有项目的权重。
在0和所有项目加和权重区间生成一个随机数,通过这个随机数来选择一个项目。
针对所选项目下所有适合的广告,加和所有广告的权重。
在0和所有广告加和权重区间生成一个随机数,通过这个随机数来选择一个广告。
OpenX 2.8.0以前版本
针对所有广告位对应的广告,把每个广告的权重权重乘以对应的项目权重,获得一个总体广告/项目权重值。
加和所有广告的总体权重值。
将每个广告的总体权重值除以所有广告的总体权重值。(此步骤保证每个总体权重值加和后值为1)
在0和1之间生成一个随机数,通过这个随机数来选择一个广告,所以广告是基于项目/广告权重来进行分配投放的。
Contract项目广告选择步骤
在上述步骤中,在测试Contract项目下的广告投放时,如果有超过一个广告可以被投放,可以通过下面的步骤来决定投放哪一个广告:

在有效广告中查找优先级为10的Contract项目(如果有):
针对每个广告,选择预先计算的优先级值乘以一个预先计算的优先级参数值4得到总体优先级参数值。
加和所有广告的总体优先级参数值。
将每个广告的总体优先级参数值除以所有广告的总体优先级参数加和值。(此步骤保证新的总体优先级参数值加和后不大于1.5)
在0和1之间生成一个随机值,通过这个随机数来选择一个广告,也有可能选择不了。
如果没有广告被选择,则针对Contract项目优先级为9,8,然后7的所有广告重复上面的步骤。直到对应的Contract项目优先级为1。
PV日志记录顺序

特殊广告代码(图片,无Cookie图片,XML-RPC)在展示广告后不记录PV日志,而对应的在记录请求的时候就被记录的PV日志。这就意味着,在展示广告之前,就已经记录了PV日志。这是因为这些广告代码,不适合投放PV日志记录的标记。6

一个有效的广告是指所属项目正在运行,而且该广告没有被禁止使用。[↩]
这个意味着,该广告实际上试图被投放出来,但是可能由于所设置的投放限制或者投放策略问题而没有被显示。 [↩]
举个例子,HTML广告在使用图片或者无Cookie图片广告代码时就不能显示出来。因为那些广告代码只能投放图片广告。 [↩]
这些值来自于Maintenance Prioritization Engine. [↩]
如果Maintenance Prioritization Engine决定Contract项目不用使用所有可用流量来满足项目需求的时候,则可能加和的新优先级参数值小于1。[↩]
日志记录标记其实是一个单独投放的1×1 .gif像素图片,当然如果一个广告没有真正的投放的用户看到的网页上,则对应的广告PV不会记录。[↩]