是否可以在CURLOPT_HEADERFUNCTION设置的回调函数中终止HTTP请求?

时间:2014-11-03 15:21:31

标签: php http libcurl

目前我正在编写一个PHP脚本,用于检查URL是否是最新的(返回HTTP 200代码或重定向到这样的URL)。

由于要测试的几个URL返回一个文件,我想避免使用普通的GET请求,以便不必实际下载文件。

我通常会使用HTTP HEAD方法,但测试表明,许多服务器无法识别它并返回与相应GET请求不同的HTTP代码。

我的想法是知道发出GET请求并使用CURLOPT_HEADERFUNCTION来定义一个回调函数,该函数检查标头第一行中的HTTP代码,然后通过让它返回0(而不是长度)来立即终止请求标题)如果它不是重定向代码。

我的问题是:是否可以终止这样的HTTP请求?或者它会对服务器产生任何负面影响?这实际上会避免不必要的下载吗?

示例代码(未经测试):

$url = "http://www.example.com/";

$ch = curl_init($url);

curl_setopt_array($ch, array(
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HEADER => true,
    CURLINFO_HEADER_OUT => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADERFUNCTION => 'requestHeaderCallback',
));

$curlResult = curl_exec($ch);

curl_close($ch);

function requestHeaderCallback($ch, $header) {
    $matches = array();
    if (preg_match("/^HTTP/\d.\d (\d{3}) /")) {
        if ($matches[1] < 300 || $matches[1] >= 400) {
            return 0;
        }
    }
    return strlen($header);
}

1 个答案:

答案 0 :(得分:1)

是的,没关系,是的,它会在那里停止转移。

它还会导致连接断开连接,如果您打算对同一主机执行多次请求,那么这只是一个问题,因为保持连接活动可能会带来性能优势。