2012-12-12 39 views
1

我通常运行两种方法,这取决于服务器配置,它使用PHP远程检查CDN托管的脚本的可用性。一个是cURL,另一个是fopen。我结合这两个功能我用在各自的情况下,像这样:在WordPress中使用CDN托管脚本的单一功能

function use_cdn(){ 
    $url = 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'; // the URL to check against 
    $ret = false; 
    if(function_exists('curl_init')) { 
     $curl = curl_init($url); 
     curl_setopt($curl, CURLOPT_NOBODY, true); 
     $result = curl_exec($curl); 
     if (($result !== false) && (curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200)) $ret = true; 
     curl_close($curl); 
    } 
    else { 
     $ret = @fopen($url,'r'); 
    } 
    if($ret) { 
     wp_deregister_script('jquery'); // deregisters the default WordPress jQuery 
     wp_register_script('jquery', $url); // register the external file 
     wp_enqueue_script('jquery'); // enqueue the external file 
    } 
    else { 
     wp_enqueue_script('jquery'); // enqueue the local file 
    } 
} 

...但我不希望推倒重来。这是一个好的,坚实的技术,还是任何人都可以提供关于如何简化/简化流程的指针?

+0

我会很担心,如果谷歌CDN崩溃,世界将会结束。 O.o –

+0

@cryptic我知道,但是Google不必因为某些地区/某些网络等原因而无法使用CDN。 –

+0

请看我的简化方法。 –

回答

1

使用get_headers()我们可以发出一个HEAD请求并检查响应代码以查看该文件是否可用,并且还会允许我们查看网络或DNS是否关闭,因为它会导致get_headers()失败(保留@符号来抑制PHP错误,如果域名无法解析,这将导致它在这种情况下返回FALSE,因此加载本地文件:

function use_cdn() 
{ 
    $url = 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'; // the URL to check against 
    $online = FALSE; 

    if(function_exists('curl_init')) 
    { 
     $curl = curl_init($url); 
     curl_setopt($curl, CURLOPT_NOBODY, TRUE); 
     $result = curl_exec($curl); 
     if ((FALSE !== $result) && ('200' == curl_getinfo($curl, CURLINFO_HTTP_CODE))) 
     { 
      $online = TRUE; 
     } 
     curl_close($curl); 
    } 
    else if (ini_get('allow_url_fopen')) 
    { 
     stream_context_set_default(array('http' => array('method' => 'HEAD'))); // set as HEAD request 
     $headers = @get_headers($url, 1); // get HTTP response headers 
     if ($headers && FALSE !== strpos($headers[0], '200')) // if get_headers() passed and 200 OK 
     { 
      $online = TRUE; 
     } 
    } 

    if ($online) 
    { 
     wp_deregister_script('jquery'); // deregisters the default WordPress jQuery 
     wp_register_script('jquery', $url); // register the external file 
    } 
    wp_enqueue_script('jquery'); // enqueue registered files 
} 

get_headers()会更快,因为它是在功能上构建,反对不得不加载一个PECL扩展,比如cURL。对于fopen(),你需要做的任务是检查响应头,get_headers()的唯一用处就是做这件事,fopen()不能获取头,cURL还有其他用途提到不必要的开销,并且不专注于获取标题,因此在这种情况下它将是最合适的选择。

+0

我喜欢那样。使用'get_headers()'而不是'fopen'或'cURL'有什么好处?有没有事实上的标准? –

+0

get_headers()会更快,因为它是一个内置函数,与加载PECL扩展(如cURL)相反。至于fopen(),你需要做的任务是检查响应头信息,get_headers()的唯一用处就是做到这一点,fopen()不能获取头文件,而cURL有其他用途,不必提及不必要的开销,并不专注于获取标题,所以这将是在这种情况下使用最合适的选择。 –

+0

嗯,太棒了!公认。也许在你的答案中加上一个注释来解释这些优点? –