PHP cURL请求次数、执行时间等信息获取及返回0异常排查
问题分析与解决
你遇到的$http_request返回0的核心原因是代码里执行了两次curl_exec调用:第一次是开启CURLOPT_NOBODY=1的HEAD请求,第二次是正常GET请求。cURL的统计信息(包括CURLINFO_NUM_CONNECTS)会在每次curl_exec后被重置或覆盖,导致最后获取的是第二次请求的孤立统计,若第二次请求复用了第一次的连接,就可能返回0。
另外,单独发起HEAD请求获取Content-Type完全多余——一次GET请求完成后,就能通过curl_getinfo拿到响应的Content-Type。
修正后的代码
function file_get_contents_curl($url) { // 给User-Agent加默认值,兼容CLI等无HTTP环境 $agent = $_SERVER['HTTP_USER_AGENT'] ?? 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'; $ch = curl_init(); curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_USERAGENT, $agent); curl_setopt($ch, CURLOPT_VERBOSE, true); // 仅执行一次请求,同时获取内容和完整统计信息 $data = curl_exec($ch); // 提取所需的统计数据 $http_connect_count = curl_getinfo($ch, CURLINFO_NUM_CONNECTS); $total_time = curl_getinfo($ch, CURLINFO_TOTAL_TIME); $redirect_count = curl_getinfo($ch, CURLINFO_REDIRECT_COUNT); $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); // 设置响应Content-Type头 if ($content_type) { header('Content-Type:' . $content_type); } // 输出统计信息 echo "HTTP连接建立次数: " . $http_connect_count . "<br>"; echo "总耗时: " . $total_time . " 秒<br>"; echo "重定向次数: " . $redirect_count . "<br>"; // 若需要总请求次数(初始请求+重定向),使用以下行 echo "总HTTP请求次数: " . ($redirect_count + 1) . "<br>"; return $data; } $homepage = file_get_contents_curl("https://example.com"); echo $homepage;
关键说明
- 合并请求:只执行一次
curl_exec,确保统计信息覆盖完整的请求流程(包括自动跟踪的重定向),不会被中途重置。 - 统计项对应需求:
CURLINFO_NUM_CONNECTS:返回cURL建立的TCP连接数,对应你要的"发起HTTP请求的连接次数"。CURLINFO_TOTAL_TIME:返回从初始化cURL到请求全部完成的总耗时(单位:秒)。CURLINFO_REDIRECT_COUNT:返回自动跟踪的重定向次数,若要总请求次数(初始请求+重定向),用$redirect_count + 1即可。
- 容错优化:给
$_SERVER['HTTP_USER_AGENT']添加默认值,避免非Web环境(如CLI)下该变量不存在导致报错。
内容的提问来源于stack exchange,提问作者Mehul Kumar
相关产品推荐
相关产品推荐

