PHP获取远程URL HTTP状态码的几种方法对比与封装
在PHP开发中,验证远程链接有效性或检查服务端状态常需获取HTTP状态码。本文详解使用 get_headers() 和 cURL 扩展的几种实现方案,重点展示如何通过参数优化提升获取效率,并附上整合两种功能的实用函数。
直接获取头信息的原生方法
PHP内置了 get_headers() 函数,可直接读取目标URL的响应头信息,其中包含第一行的状态码行。这种方式代码极简,适合快速判断。
$header_info = get_headers('https://www.jb51.net/');
echo $header_info[0];
// 典型耗时范围: 0.67s ~ 0.78s
该方法的优点是无需初始化连接句柄,但底层依然执行了完整的HEAD请求,速度受网络环境影响较大。
基于cURL的标准实现
cURL 是处理复杂HTTP请求的首选扩展。通过初始化会话、设置选项并执行,可以精确提取状态码。这种方法灵活度高,支持代理、超时控制等高级功能。
$ch = curl_init('https://www.jb51.net/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 获取状态码,如 200
curl_close($ch);
echo $httpcode;
相比原生函数,基础cURL方案在测试中耗时略高(约 0.84s~0.94s),主要因为默认会下载完整的Body内容,即便我们只关心状态码。
优化cURL性能的关键步骤
为了解决上述性能损耗,核心优化点在于告诉服务器不需要返回Body数据。通过设置 CURLOPT_NOBODY 为 true,客户端将发送HEAD请求而非GET请求,从而大幅减少数据传输量并降低响应时间。
$curl = curl_init();
$url = 'https://www.jb51.net/';
curl_setopt($curl, CURLOPT_URL, $url); // 设置目标URL
curl_setopt($curl, CURLOPT_HEADER, 1); // 启用Header输出
curl_setopt($curl, CURLOPT_NOBODY, true); // 关键:仅获取头部,忽略Body
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 将结果存入变量而非直接输出
curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
echo $httpcode;
// 优化后典型耗时: 0.45s ~ 0.53s
引入 CURLOPT_NOBODY 后,请求耗时显著缩短,接近原生函数的水平,同时保留了cURL的控制能力。在实际生产环境中,通常还会配合 CURLOPT_TIMEOUT 防止因网络阻塞导致脚本挂起。
整合版工具函数
为了方便在不同场景下使用,可以将上述逻辑封装为一个统一函数。该函数支持配置超时时间,并能根据参数决定仅返回状态数值还是完整的Header数组。
/**
* 获取远程URL的HTTP状态
*
* @param string $url 远程URL
* @param bool $data 若为true返回完整Header数组,false仅返回状态码数值
* @return mixed
*/
function getHeaders($url, $data = FALSE) {
$_headers = get_headers($url, 1);
if (!$data) {
return $_headers;
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url); // 设置请求URL
curl_setopt($curl, CURLOPT_HEADER, 1); // 获取Header
curl_setopt($curl, CURLOPT_NOBODY, 1); // 不返回Body主体
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 返回字符串而非直接输出
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时时间为30秒
curl_exec($curl);
$rtn = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
return $rtn;
}
使用示例:
- 仅获取状态码:
echo getHeaders('https://www.jb51.net/', false);,返回例如200。 - 获取完整Header:
print_r(getHeaders('https://www.jb51.net/', true));,返回包含Server、Date等信息的关联数组。
总结
获取HTTP状态码时,若仅需简单判断,get_headers() 最为便捷;若需集成到复杂的网络请求模块中,推荐使用带 CURLOPT_NOBODY 优化的 cURL 实现,以兼顾功能性与执行效率。以上就是PHP获取访问页面HTTP状态码的实现代码的详细内容,更多关于PHP远程请求的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













