1

サーバーの構成に応じて、PHP を使用して CDN でホストされたスクリプトの可用性をリモートで確認する方法として、一般的に 2 つの方法に出くわしました。一つはcURL、もう一つは ですfopen。次のように、それぞれのケースで使用する 2 つの関数を組み合わせました。

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

...しかし、車輪を再発明するつもりはありません。これは優れた堅実な手法ですか、またはプロセスを簡素化/合理化する方法について誰かが指針を提供できますか?

4

1 に答える 1

1

get_headers()を使用して HEAD リクエストを発行し、応答コードをチェックしてファイルが利用可能かどうかを確認できます。また、get_headers() が失敗する原因となるため、ネットワークまたは DNS がダウンしているかどうかも確認できます (@ 記号を保持します)。ドメインが解決できない場合に 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() は組み込み関数であるため、cURL などの PECL 拡張機能をロードする必要がなく、高速です。fopen() に関しては、あなたがする必要があるタスクは応答ヘッダーをチェックすることです.get_headers() の唯一の用途はそれを行うことです.fopen() はヘッダーを取得できません.ヘッダーの取得に特化していないため、この場合に使用するのに最適な選択肢です。

于 2012-12-12T06:57:58.827 に答える