PHP获取远程URL HTTP状态码的几种方法对比与封装

小鹿同学
小鹿同学
发布时间:2026-10-13| 6人浏览过
原创

在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远程请求的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。