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

标签 php http libcurl

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

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

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

我的想法是发出 GET 请求并使用 CURLOPT_HEADERFUNCTION 定义一个回调函数,该函数检查 header 第一行中的 HTTP 代码,然后通过返回 0(而不是 header )如果它不是重定向代码。

我的问题是:可以这样终止 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);
}

最佳答案

是的,没问题,是的,它会立即停止传输。

它还会导致连接断开,只有当您打算向同一主机发出许多请求时才需要担心,因为保持连接事件可能会提高性能。

关于php - 在CURLOPT_HEADERFUNCTION设置的回调函数中终止HTTP请求是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717284/

相关文章:

c - 使用libcurl访问代理

javascript - 将 id 值从 href 传递到 bootstrap modal php

javascript - 如果语句为真,则在加载页面上显示隐藏 div

python - 带有 cookie 的 HTTP POST 和 GET 用于在 python 中进行身份验证

python - 是否允许大小为 269KB 的 HTTP Get 请求?

c++ - 在 C++ 中使用 LibCurl 和自签名证书

php - mysql_fetch_assoc 中的 while 循环不起作用

javascript - 使用 jQuery Ajax 设置 PHP session 变量

angular - 如何解决 Angular 中的 HTTPErrorResponse 问题

Windows 上的 curl/curl.h