php 广告加载类

来源:互联网 发布:乐乎记录生活 编辑:程序博客网 时间:2024/05/23 01:18

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>");<? } ?>
源码下载地址:点击查看