使用带有安全回调的CDN脚本的WP入队脚本

时间:2014-06-02 作者:Sagive

我想包括来自远程CDN的几个脚本和样式。。。在本例中,是引导和类似文件,但我想以回调的形式提供一个安全网,以防CDN由于某种原因停机。。。

我想添加一些代码,但我真的不知道如何处理这个问题。。。

Here is an example of a regular wp_enqueue_script i currently use:

wp_enqueue_script( \'bootstrap\', \'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js\', array(\'jquery\'), 3.3, true);

5 个回复
最合适的回答,由SO网友:Algorini 整理而成

公认的答案是完全错误的。我怀疑这是对OP问题的一个严重误解,因为任何有一点编程经验的人都不会推荐“缓存自己的脚本副本,并每20分钟执行一次get\\u url调用”。

@PaulG.表示,在每次页面加载时从CDN加载没有任何意义。

这就是使用CDN的全部意义所在。如果不从CDN加载,而是加载缓存副本,客户端必须从服务器下载。你可能在新西兰奥克兰,你的客户可能在伦敦。您的服务器将永远无法匹配位于客户端附近的CDN。

此外,CDN使用NGINX/Varnish之类的东西,拥有大量缓存,甚至不接触服务器。您的服务器可能会也可能不会使用像NGINX这样的反向代理来进行负载平衡,它可能会也可能不会有一个大型缓存来服务静态文件,因此为了加载文件的副本,它必须遍历整个堆栈,这远不及加载缓存静态文件的速度。

无论您做什么,请尽可能使用CDN,并且在每个页面加载上都是这样。

最后,您担心CDN会崩溃。如果发生这种情况,一个简单的解决方法是提到2或3个其他CDN作为后备,如果主CDN无法加载,您可以轻松地连接一个侦听器并从其他CDN加载。

如果所有主要CDN都出现故障,您的网站将不是世界上唯一一个无法正常工作的网站,您可以添加Facebook、Imgur、Flckr和其他十几亿个将导致您失败的网站。到那时,最好到外面看看天空,也许你会发现导致人类历史上第一次全球数据中心故障的不明飞行物。

简短回答:使用Cdn。

回退url的示例requirejs脚本。

   requirejs.config({
   enforceDefine: true,
   paths: {
       jquery: [
        \'//ajax.aspnetcdn.com/ajax/jquery/jquery-2.0.0.min\',
        //If the CDN location fails, load from this location
        //xyz.com/jquery.min.js
      ]
   }
   });

SO网友:Paul G.

我在上一篇文章中做了两件事:

使用本机WordPress http调用函数缓存CDN已运行20分钟的事实(您可以对此进行调整)。您确实不想在每次加载页面时都获取CDN内容。当你这样做的时候,没有必要用CDN来加速你的站点

$get_the_url = \'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js\';

$cdnIsUp = get_transient( \'cnd_is_up\' );

if ( $cdnIsUp ) {

    $load_source = \'load_external_bootstrap\';

} else {

    $cdn_response = wp_remote_get( $get_the_url );

    if( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code($cdn_response) != \'200\' ) {

        $load_source = \'load_local_bootstrap\';

    }
    else {

        $cdnIsUp = set_transient( \'cnd_is_up\', true, MINUTE_IN_SECONDS * 20 );
        $load_source = \'load_external_bootstrap\';
    }
 }

add_action(\'wp_enqueue_scripts\', $load_source );

function load_external_bootstrap() { 
    wp_register_script( \'bootstrap\', \'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js\', array(\'jquery\'), 3.3, true); 
    wp_enqueue_script(\'bootstrap\'); 
}

function load_local_bootstrap() {
    wp_register_script(\'bootstrap\', get_bloginfo(\'template_url\').\'/js/bootstrap.min.js\', __FILE__, array(\'jquery\'), 3.3, true);
    wp_enqueue_script(\'bootstrap\'); 
}

SO网友:Matt Royal

您可以尝试这样做,首先测试CDN版本,然后根据是否可用有条件地加载:

$get_the_url = \'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js\';
    $test_the_url = @fopen( $get_the_url,\'r\' );

    if ( $test_the_url !== false ) {

        function load_external_bootstrap() { 
        wp_register_script( \'bootstrap\', \'http://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js\', array(\'jquery\'), 3.3, true); 
        wp_enqueue_script(\'bootstrap\'); 

    }

    add_action(\'wp_enqueue_scripts\', \'load_external_bootstrap\');

    } else {

        function load_local_bootstrap() {
        wp_register_script(\'bootstrap\', get_bloginfo(\'template_url\').\'/js/bootstrap.min.js\', __FILE__, array(\'jquery\'), 3.3, true);
        wp_enqueue_script(\'bootstrap\'); 
    }

    add_action(\'wp_enqueue_scripts\', \'load_local_bootstrap\');
    }

SO网友:Ciro Mattia Gonano

我提出了两个包装函数:

function wp_enqueue_cdn_script( $handle, $src_cdn = false, $src_local = false, $deps = array(), $ver = false, $in_footer = false ) {
    $cdnIsUp = get_transient( $handle . \'_script_cdn_is_up\' );
    if ( $cdnIsUp ) {
        wp_enqueue_script( $handle, $src_cdn, $deps, $ver, $in_footer );
    } else {
        $cdn_response = wp_remote_get( $src_cdn );
        if ( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code( $cdn_response ) != \'200\' ) {
            wp_enqueue_script( $handle, $src_local, $deps, $ver, $in_footer );
        } else {
            $cdnIsUp = set_transient( $handle . \'_script_cdn_is_up\', true, MINUTE_IN_SECONDS * 20 );
            wp_enqueue_script( $handle, $src_cdn, $deps, $ver, $in_footer );
        }
    }
}

function wp_enqueue_cdn_style( $handle, $src_cdn = false, $src_local = false, $deps = array(), $ver = false, $media = \'all\' ) {
    $cdnIsUp = get_transient( $handle . \'_style_cdn_is_up\' );
    if ( $cdnIsUp ) {
        wp_enqueue_style( $handle, $src_cdn, $deps, $ver, $media);
    } else {
        $cdn_response = wp_remote_get( $src_cdn );
        if ( is_wp_error( $cdn_response ) || wp_remote_retrieve_response_code( $cdn_response ) != \'200\' ) {
            wp_enqueue_style( $handle, $src_local, $deps, $ver, $media);
        } else {
            $cdnIsUp = set_transient( $handle . \'_style_cdn_is_up\', true, MINUTE_IN_SECONDS * 20 );
            wp_enqueue_style( $handle, $src_cdn, $deps, $ver, $media);
        }
    }
}
但我想知道它是否真的有用:它会使服务器过载,我们假装如果服务器可以访问CDN,客户端也可以,这在现实世界中并不总是正确的。

SO网友:Mark

@ciro完全正确地认为服务器连接不是一个合适的测试。回退的重点是确保可以向客户提供文档。

有一些国家被谷歌屏蔽(例如)。如果您的web服务器位于加利福尼亚州,但访问者位于Google被阻止的国家,则此PHP服务器端调用将测试为TRUE,但脚本不会提供给用户。

看见How to enqueue jQuery fallback - WordPress 对于使用本地备份排队并测试客户端而不是服务器的方法。

结束

相关推荐

Optimize shortcode callbacks

我创建了一个插件,在我的WordPress站点中添加了一些短代码。但我是一个PHP新手,所以我相信它可能有一些错误或优化它的方法。它工作正常,显然没有问题。内存使用率为00.04MB。你能看看吗?非常感谢!add_action( \'wp_enqueue_scripts\', \'prefix_add_my_stylesheet\' ); function prefix_add_my_stylesheet() { // Respects SSL, Styl