php广告加载类用法实例

本文实例讲述了php广告加载类的用法,非常实用。分享给大家供大家参考。具体方法如下:

php广告加载类,支持异步与同步加载。需要使用Jquery实现。

ADLoader.class.php类文件如下:

<?php /** 广告加载管理类 *  Date:  2013-08-04 *  Author: fdipzone *  Ver:  1.0 * *  Func: *  public load     加载广告集合 *  public setConfig  广告配置 *  private getAds    根据channel创建广告集合 *  private genZoneId  zoneid base64_encode 处理 *  private genHtml   生成广告html *  private checkBrowser 检查是否需要同步加载的浏览器 */  class ADLoader{ // class start    private static $_ads = array();   // 广告集合   private static $_step = 300;    // 广告加载间隔   private static $_async = true;   // 是否异步加载   private static $_config = array(); // 广告设置文件   private static $_jsclass = null;  // 广告JS class     /** 加载广告集合   * @param String $channel 栏目,对应config文件   * @param int   $step  广告加载间隔   * @param boolean $async  是否异步加载   */   public static function load($channel='', $step='', $async=''){     if(isset($step) && is_numeric($step) && $step>0){       self::$_step = $step;     }      if(isset($async) && is_bool($async)){       self::$_async = $async;     }      // 判断浏览器,如IE强制使用同步加载     if(!self::checkBrowser()){       self::$_async = false;     }      self::getAds($channel);     self::genZoneId();      return self::genHtml();   }    /** 设置config   * @param String $config 广告配置   * @param String $jsclass js class文件路径   */   public static function setConfig($config=array(), $jsclass=''){     self::$_config = $config;     self::$_jsclass = $jsclass;   }     /** 根据channel创建广告集合   * @param String $channel 栏目   */   private static function getAds($channel=''){     $AD_Config = self::$_config;     if($AD_Config!=null){       self::$_ads = isset($AD_Config[$channel])? $AD_Config[$channel] : $AD_Config['default'];     }   }    /** zoneid base64_encode 处理 */   private static function genZoneId(){      // 同步加载广告不需要处理zoneid     if(!self::$_async){       return ;     }      $ads = self::$_ads;     for($i=0,$len=count($ads); $i<$len; $i++){       if(isset($ads[$i]['zoneId'])){         $ads[$i]['zoneId'] = base64_encode('var zoneid='.$ads[$i]['zoneId'].';');       }     }     self::$_ads = $ads;   }    /** 生成广告html */   private static function genHtml(){     $ads = self::$_ads;     $html = array();     if(self::$_jsclass!=null && $ads){       array_push($html, '<script type="text/Javascript" src="'.self::$_jsclass.'"></script>');        // 同步需要预先加载       if(!self::$_async){         foreach($ads as $ad){           array_push($html, '<div id="'.$ad['domId'].'_container" style="display:none">');           array_push($html, '<script type="text/Javascript">');           array_push($html, 'ADLoader.preload('.json_encode($ad).');');           array_push($html, '</script>');           array_push($html, '</div>');         }       }        array_push($html, '<script type="text/Javascript">');       array_push($html, 'var ads='.json_encode($ads).';');       array_push($html, '$(document).ready(function(){ ADLoader.load(ads, '.self::$_step.', '.intval(self::$_async).'); });');       array_push($html, '</script>');     }     return implode("/r/n", $html);   }    /** 判断是否需要强制同步加载的浏览器 */   private static function checkBrowser(){     $user_agent = $_SERVER['HTTP_USER_AGENT'];     if(strstr($user_agent,'MSIE')!=''){       return false;     }     return true;   }  } // class end ?>

ADConfig.php文件如下:

<?php /** 广告配置文件 **/  return array(    'case_openx' => array(     array(       'type' => 'openx',       'domId' => 'ad_728x90',       'zoneId' => 452     ),     array(       'type' => 'openx',       'domId' => 'ad_300x250',       'zoneId' => 449     ),     array(       'type' => 'openx',       'domId' => 'ad_l2_300x250',       'zoneId' => 394     ),   ),    'case_url' => array(     array(       'type' => 'url',       'domId' => 'ad_728x90',       'url' => 'adurl.php?zoneid=452'     ),     array(       'type' => 'url',       'domId' => 'ad_300x250',       'url' => 'adurl.php?zoneid=449'     ),     array(       'type' => 'url',       'domId' => 'ad_l2_300x250',       'url' => 'adurl.php?zoneid=394'     )   ),    'case_sync_openx' => array(     array(       'type' => 'openx',       'domId' => 'ad_728x90',       'zoneId' => 452     ),     array(       'type' => 'openx',       'domId' => 'ad_300x250',       'zoneId' => 449     ),     array(       'type' => 'openx',       'domId' => 'ad_l2_300x250',       'zoneId' => 394     ),   ),    'default' => array(     array(       'type' => 'openx',       'domId' => 'ad_728x90',       'zoneId' => 452     ),     array(       'type' => 'openx',       'domId' => 'ad_300x250',       'zoneId' => 449     ),     array(       'type' => 'openx',       'domId' => 'ad_l2_300x250',       'zoneId' => 394     ),   ),  );  ?>

ADLoader.js文件如下:

/** 异步加载广告 *  Date:  2013-08-04 *  Author: fdipzone *  Ver:  1.0 */ var ADLoader = (function(){    var _ads = [],   // 广告集合     _step = 300,  // 广告加载间隔     _async = true, // 是否异步加载     _loaded = 0;  // 已经加载的广告数      /** loadAd 循环加载广告   * @param int c 第几个广告   */   function loadAD(c){     if(_loaded>=_ads.length){       return ;     }      if($('#'+_ads[c].domId).length>0){ // 判断dom是否存在        if(_async){ // 异步执行          crapLoader.loadScript(getScript(_ads[c]), _ads[c].domId, {           success: function(){             completeAd();           }         });              }else{ // 将同步加载的广告显示          var ad_container = $('#'+_ads[c].domId+'_container');         ad_container.find('embed').attr('wmode','transparent').end().find('object').each(function(k, v){           v.wmode = 'transparent'; // 将flash变透明         });         $('#'+_ads[c].domId)[0].appendChild(ad_container[0]);         ad_container.show();                  completeAd();       }     }else{ // dom不存在       completeAd();     }   }    /** 加载完广告后处理 */   function completeAd(){     _loaded ++;     setTimeout(function(){       loadAD(_loaded);     }, _step);       }    /** 获取广告   * @param Array ad 广告参数   */   function getScript(ad){     var ret = null;      switch(ad.type){       case 'openx': // openx code ad         ret = 'data:text/Javascript;base64,' + ad.zoneId + 'dmFyIG0zX3UgPSAobG9jYXRpb24ucHJvdG9jb2w9PSdodHRwczonPydodHRwczovL2Fkcy5ubWcuY29tLmhrL3d3dy9kZWxpdmVyeS9hanMucGhwJzonaHR0cDovL2Fkcy5ubWcuY29tLmhrL3d3dy9kZWxpdmVyeS9hanMucGhwJyk7CnZhciBtM19yID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjk5OTk5OTk5OTk5KTsKaWYgKCFkb2N1bWVudC5NQVhfdXNlZCkgZG9jdW1lbnQuTUFYX3VzZWQgPSAnLCc7CmRvY3VtZW50LndyaXRlICgiPHNjciIrImlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIHNyYz0nIittM191KTsKZG9jdW1lbnQud3JpdGUgKCI/em9uZWlkPSIgKyB6b25laWQpOwpkb2N1bWVudC53cml0ZSAoJyZhbXA7Y2I9JyArIG0zX3IpOwppZiAoZG9jdW1lbnQuTUFYX3VzZWQgIT0gJywnKSBkb2N1bWVudC53cml0ZSAoIiZhbXA7ZXhjbHVkZT0iICsgZG9jdW1lbnQuTUFYX3VzZWQpOwpkb2N1bWVudC53cml0ZSAoZG9jdW1lbnQuY2hhcnNldCA/ICcmYW1wO2NoYXJzZXQ9Jytkb2N1bWVudC5jaGFyc2V0IDogKGRvY3VtZW50LmNoYXJhY3RlclNldCA/ICcmYW1wO2NoYXJzZXQ9Jytkb2N1bWVudC5jaGFyYWN0ZXJTZXQgOiAnJykpOwpkb2N1bWVudC53cml0ZSAoIiZhbXA7bG9jPSIgKyBlc2NhcGUod2luZG93LmxvY2F0aW9uKSk7CmlmIChkb2N1bWVudC5yZWZlcnJlcikgZG9jdW1lbnQud3JpdGUgKCImYW1wO3JlZmVyZXI9IiArIGVzY2FwZShkb2N1bWVudC5yZWZlcnJlcikpOwppZiAoZG9jdW1lbnQuY29udGV4dCkgZG9jdW1lbnQud3JpdGUgKCImY29udGV4dD0iICsgZXNjYXBlKGRvY3VtZW50LmNvbnRleHQpKTsKaWYgKGRvY3VtZW50Lm1tbV9mbykgZG9jdW1lbnQud3JpdGUgKCImYW1wO21tbV9mbz0xIik7CmRvY3VtZW50LndyaXRlICgiJz48XC9zY3IiKyJpcHQ+Iik7';         break;              case 'url': // url ad         ret = ad.url;         break;     }     return ret;   }    /** 同步加载广告   * @param Array ad 广告参数   */   function writeAd(ad){     switch(ad.type){       case 'openx':         var m3_u = (location.protocol=='https:'?'https://ads.nmg.com.hk/www/delivery/ajs.php':'http://ads.nmg.com.hk/www/delivery/ajs.php');         var m3_r = Math.floor(Math.random()*99999999999);         if (!document.MAX_used) document.MAX_used = ',';         document.write ("<scr"+"ipt type='text/Javascript' src='"+m3_u);         document.write ("?zoneid=" + ad.zoneId);         document.write ('&cb=' + m3_r);         if (document.MAX_used != ',') document.write ("&exclude=" + document.MAX_used);         document.write (document.charset ? '&charset='+document.charset : (document.characterSet ? '&charset='+document.characterSet : ''));         document.write ("&loc=" + escape(window.location));         if (document.referrer) document.write ("&referer=" + escape(document.referrer));         if (document.context) document.write ("&context=" + escape(document.context));         if (document.mmm_fo) document.write ("&mmm_fo=1");         document.write ("'><//scr"+"ipt>");         break;        case 'url':         document.write ('<script type="text/Javascript" src="' + ad.url + '"></script>');         break;     }   }    obj = {      /** 加载广告     * @param Array  ads  广告集合     * @param int   step 广告加载间隔     * @param boolean async true:异步加载 false:同步加载     */     load: function(ads, step, async){       _ads = ads;        if(typeof(step)!='undefined'){         _step = step;       }        if(typeof(async)!='undefined'){         _async = async;       }        loadAD(_loaded);     },      /** 预加载广告 */     preload: function(ad){       if($('#'+ad.domId).length>0){  // 判断dom是否存在         writeAd(ad);       }     }   }   return obj;  }());  /* crapLoader */ var crapLoader = (function() {      var isHijacked = false,     queue = [],     inputBuffer = [],     writeBuffer = {},     loading = 0,     elementCache = {},     returnedElements = [],     splitScriptsRegex = /(<script[/s/S]*?<//script>)/gim,     globalOptions = {       autoRelease: true,       parallel: true,       debug: false     },     defaultOptions = {       charset: undefined,       success: undefined,       func: undefined,       src: undefined,       timeout: 3000     },publ,     head = document.getElementsByTagName("head")[0] || document.documentElement,     support = {       scriptOnloadTriggeredAccurately: false,       splitWithCapturingParentheses: ("abc".split(/(b)/)[1]==="b")     };      function checkQueue () {     if(queue.length) {       loadScript( queue.shift() );     } else if(loading === 0 && globalOptions.autoRelease) {       debug("Queue is empty. Auto-releasing.");       publ.release();     }   }    function checkWriteBuffer (obj) {     var buffer = writeBuffer[obj.domId],       returnedEl;      if(buffer && buffer.length) {       writeHtml( buffer.shift(), obj );      } else {       while (returnedElements.length > 0) {         returnedEl = returnedElements.pop();         var id = returnedEl.id;         var elInDoc = getElementById(id);         if (!elInDoc) { continue; }         var parent = elInDoc.parentNode;         elInDoc.id = id + "__tmp";         parent.insertBefore(returnedEl, elInDoc);         parent.removeChild(elInDoc);       }       finished(obj);     }   }    function debug (message, obj) {     if(!globalOptions.debug || !window.console) { return; }     var objExtra = "";     if(obj) {       objExtra = "#"+obj.domId+" ";       var depth = obj.depth;       while(depth--) { objExtra += "  "; }     }     console.log("crapLoader " + objExtra + message);   }    function extend (t, s) {     var k;     if(!s) { return t; }     for(k in s) {       t[k] = s[k];     }     return t;   }    function finished (obj) {     if(obj.success && typeof obj.success === "function") {       obj.success.call( document.getElementById(obj.domId) );     }     checkQueue();   }    function flush (obj) {     var domId = obj.domId,       outputFromScript,       htmlPartArray;      outputFromScript = stripNoScript( inputBuffer.join("") );     inputBuffer = [];      htmlPartArray = separateScriptsFromHtml( outputFromScript );      if(!writeBuffer[domId]) {       writeBuffer[domId] = htmlPartArray;     } else {       Array.prototype.unshift.apply(writeBuffer[domId], htmlPartArray);     }     checkWriteBuffer(obj);   }    function getCachedElById (domId) {     return elementCache[domId] || (elementCache[domId] = document.getElementById(domId));   }    function getElementById (domId) {     return ( publ.orgGetElementById.call ?       publ.orgGetElementById.call(document, domId) :       publ.orgGetElementById(domId) );   }    function getElementByIdReplacement (domId) {     var el = getElementById(domId),       html, frag, div, found;      function traverseForElById(domId, el) {       var children = el.children, i, l, child;       if(children && children.length) {         for(i=0,l=children.length; i<l; i++) {           child = children[i];           if(child.id && child.id === domId) { return child; }           if(child.children && child.children.length) {             var tmp = traverseForElById(domId, child);             if (tmp) return tmp;           }         }       }     }      function searchForAlreadyReturnedEl(domId) {       var i, l, returnedEl;       for(i=0,l=returnedElements.length; i<l; i++) {         returnedEl = returnedElements[i];         if(returnedEl.id === domId) { return returnedEl; }       }     }      if(el) { return el; }      if (returnedElements.length) {       found = searchForAlreadyReturnedEl(domId);       if (found) {         return found;       }     }      if(inputBuffer.length) {       html = inputBuffer.join("");       frag = document.createDocumentFragment();       div = document.createElement("div");       div.innerHTML = html;       frag.appendChild(div);       found = traverseForElById(domId, div);       if (found) {         returnedElements.push(found);       }       return found;     }   }    var globalEval = (function () {     return (window.execScript ? function(code, language) {       window.execScript(code, language || "JavaScript");     } : function(code, language) {       if(language && !/^Javascript/i.test(language)) { return; }       window.eval.call(window, code);     });   }());    function isScript (html) {     return html.toLowerCase().indexOf("<script") === 0;   }    function runFunc (obj) {     obj.func();     obj.depth++;     flush(obj);   }    function loadScript (obj) {     loading++;     // async loading code from jQuery     var script = document.createElement("script");     if(obj.type) { script.type = obj.type; }     if(obj.charset) { script.charset = obj.charset; }     if(obj.language) { script.language = obj.language; }      logScript(obj);      var done = false;     // Attach handlers for all browsers     script.onload = script.onreadystatechange = function() {       loading--;       script.loaded = true;       if ( !done && (!this.readyState ||           this.readyState === "loaded" || this.readyState === "complete") ) {         done = true;         script.onload = script.onreadystatechange = null;         debug("onload " + obj.src, obj);         flush(obj);       }     };      script.loaded = false;     script.src = obj.src;     obj.depth++;      // Use insertBefore instead of appendChild to circumvent an IE6 bug.     // This arises when a base node is used (#2709 and #4378).     head.insertBefore( script, head.firstChild );     setTimeout(function() {       if(!script.loaded) { throw new Error("SCRIPT NOT LOADED: " + script.src); }     }, obj.timeout);   }    function logScript (obj, code, lang) {     debug((code ?       "Inline " + lang + ": " + code.replace("/n", " ").substr(0, 30) + "..." :       "Inject " + obj.src), obj);   }    function separateScriptsFromHtml (htmlStr) {     return split(htmlStr, splitScriptsRegex);   }    function split (str, regexp) {     var match, prevIndex=0, tmp, result = [], i, l;      if(support.splitWithCapturingParentheses) {       tmp = str.split(regexp);     } else {       // Cross browser split technique from Steven Levithan       // http://blog.stevenlevithan.com/archives/cross-browser-split       tmp = [];       while(match = regexp.exec(str)) {         if(match.index > prevIndex) {           result.push(str.slice(prevIndex, match.index));         }          if(match.length > 1 && match.index < str.length) {           Array.prototype.push.apply(tmp, match.slice(1));         }          prevIndex = regexp.lastIndex;       }        if(prevIndex < str.length) {         tmp.push(str.slice(prevIndex));       }      }      for(i=0, l=tmp.length; i<l; i=i+1) {       if(tmp[i]!=="") { result.push(tmp[i]); }     }     return result;   }    function stripNoScript (html) {     return html.replace(/<noscript>[/s/S]*?<//noscript>/ig, "");   }    function trim (str) {     if(!str) { return str; }     return str.replace(/^/s*|/s*$/gi, "");   }    function writeHtml (html, obj) {     if( isScript(html) ) {       var dummy = document.createElement("div");       dummy.innerHTML = "dummy<div>" + html + "</div>"; // trick for IE       var script = dummy.children[0].children[0];       var lang = script.getAttribute("language") || "Javascript";       if(script.src) {         obj.src = script.src;         obj.charset = script.charset;         obj.language = lang;         obj.type = script.type;         loadScript(obj);       } else {         var code = trim( script.text );         if(code) {           logScript( obj, code, lang);           globalEval( code, lang);         }         flush(obj);       }     } else {       var container = getCachedElById(obj.domId);       if(!container) {         throw new Error("crapLoader: Unable to inject html. Element with id '" + obj.domId + "' does not exist");       }              html = trim(html); // newline before <object> cause weird effects in IE       if(html) {         container.innerHTML += html;       }       checkWriteBuffer(obj);     }   }    function writeReplacement (str) {     inputBuffer.push(str);     debug("write: " + str);   }    function openReplacement () {     // document.open() just returns the document when called from a blocking script:     // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-open     return document;   }    function closeReplacement () {     // document.close() does nothing when called from a blocking script:     // http://www.whatwg.org/specs/web-apps/current-work/#dom-document-close   }    publ = {     hijack: function(options) {       if(isHijacked) { return; }       isHijacked = true;       extend(globalOptions, options);       if(globalOptions.parallel && !support.scriptOnloadTriggeredAccurately) {         globalOptions.parallel = false;         debug("Browsers onload is not reliable. Disabling parallel loading.");       }        document.write = document.writeln = writeReplacement;       document.open = openReplacement;       document.close = closeReplacement;       document.getElementById = getElementByIdReplacement;     },      release: function() {       if(!isHijacked) { return; }       isHijacked = false;       document.write = this.orgWrite;       document.writeln = this.orgWriteLn;       document.open = this.orgOpen;       document.close = this.orgClose;       document.getElementById = this.orgGetElementById;       elementCache = {};     },      handle: function(options) {       if(!isHijacked) {         debug("Not in hijacked mode. Auto-hijacking.");         this.hijack();       }       var defaultOptsCopy = extend({}, defaultOptions);       var obj = extend(defaultOptsCopy, options);       obj.depth = 0;        if (!obj.domId) {         obj.domId = "craploader_" + new Date().getTime();         var span = document.createElement("span");         span.id = obj.domId;         document.body.appendChild(span);       }        if (options.func) {         runFunc(obj);         return;       }        if(globalOptions.parallel) {         setTimeout(function() {           loadScript(obj);         }, 1);       } else {         queue.push(obj);         setTimeout(function() {           if(loading === 0) {             checkQueue();           }         }, 1);       }     },      loadScript: function(src, domId, options) {       if (typeof domId !== "string") {         options = domId;         domId = undefined;       }       this.handle(extend({         src:  src,         domId: domId       }, options));     },      runFunc: function(func, domId, options) {       if (typeof domId !== "string") {         options = domId;         domId = undefined;       }       this.handle( extend({         domId: domId,         func:   func       }, options) );     },      orgGetElementById  : document.getElementById,     orgWrite      : document.write,     orgWriteLn     : document.writeln,     orgOpen       : document.open,     orgClose      : document.close,     _olt        : 1,     _oltCallback    : function() {       support.scriptOnloadTriggeredAccurately = (publ._olt===2);     }   };    return publ; }());

demo.php示例程序如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html>  <head>  <meta http-equiv="content-type" content="text/html; charset=utf-8">  <title> AD Loader </title>  <style type="text/css">  .banner1{margin:10px; border:1px solid #CCCCCC; width:728px; height:90px;}  .banner2{margin:10px; border:1px solid #CCCCCC; width:300px; height:250px;}  </style>  <script type="text/Javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>  </head>   <body>  <div class="banner1" id="ad_728x90"></div>  <div class="banner2" id="ad_300x250"></div>  <div class="banner2" id="ad_l2_300x250"></div>     <?php   function showAD($channel='', $step='', $async=''){    include('ADLoader.class.php');    $ad_config = include('ADConfig.php');    ADLoader::setConfig($ad_config, 'ADLoader.js');    return ADLoader::load($channel, $step, $async);   }    echo showAD('case_openx'); // 异步加载   //echo showAD('case_url');  // url方式异步加载   //echo showAD('case_sync_openx', 300, false); // 同步加载  ?>   </body> </html>

adurl.php文件如下:

<?php$zoneid = isset($_GET['zoneid'])? intval($_GET['zoneid']) : 0; if($zoneid){ ?> var zoneid = <?=$zoneid ?>; var m3_u = (location.protocol=='https:'?'https://ads.nmg.com.hk/www/delivery/ajs.php':'http://ads.nmg.com.hk/www/delivery/ajs.php'); var m3_r = Math.floor(Math.random()*99999999999); if (!document.MAX_used) document.MAX_used = ','; document.write ("<scr"+"ipt type='text/Javascript' src='"+m3_u); document.write ("?zoneid=" + zoneid); document.write ('&cb=' + m3_r); if (document.MAX_used != ',') document.write ("&exclude=" + document.MAX_used); document.write (document.charset ? '&charset='+document.charset : (document.characterSet ? '&charset='+document.characterSet : '')); document.write ("&loc=" + escape(window.location)); if (document.referrer) document.write ("&referer=" + escape(document.referrer)); if (document.context) document.write ("&context=" + escape(document.context)); if (document.mmm_fo) document.write ("&mmm_fo=1"); document.write ("'><//scr"+"ipt>"); <? } ?>

本文所述完整实例源码点击此处本站下载。

希望本文所述对大家的php程序设计有所帮助。

php技术php广告加载类用法实例,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。