我通常会遇到两种方法,根据服务器配置,使用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
}
}
......但我不打算重新发明轮子。这是一个好的,可靠的技术还是任何人都可以提供关于如何简化/简化流程的指示?
答案 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还有其他用途,更不用说不必要了开销并不专门用于获取标题,因此在这种情况下使用它是最合适的选择。