WordPress中CDN托管脚本的单个函数

时间:2012-12-12 03:35:39

标签: php wordpress curl fopen cdn

我通常会遇到两种方法,根据服务器配置,使用PHP远程检查CDN托管脚本的可用性。一个是cURL,另一个是fopen。我把我在各自案例中使用的两个函数结合起来如下:

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
   }
}

......但我不打算重新发明轮子。这是一个好的,可靠的技术还是任何人都可以提供关于如何简化/简化流程的指示?

1 个答案:

答案 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还有其他用途,更不用说不必要了开销并不专门用于获取标题,因此在这种情况下使用它是最合适的选择。