PHP 7.4中get_headers失效?URL有效性验证异常排查
URL验证代码问题分析与修正
cURL代码问题及修复
你的cURL代码存在两个核心问题:
- 输出逻辑错误:无论HTTP状态码是否为404,代码最后都会执行
echo "true",导致即使检测到404,也会同时输出"Url not working"和"true",看起来始终返回true; - 错误场景覆盖不全:只判断了404状态,未处理网络连接失败、域名解析错误、5xx服务器错误等情况,也没检查
curl_exec是否执行成功。
修正后的代码:
<?php $url = 'https://github.com'; $handle = curl_init($url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE); // 只请求头部,减少带宽消耗 curl_setopt($handle, CURLOPT_NOBODY, TRUE); // 设置超时时间,避免长时间等待 curl_setopt($handle, CURLOPT_TIMEOUT, 10); $response = curl_exec($handle); $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); $curlError = curl_errno($handle); curl_close($handle); if ($curlError !== 0) { echo "URL无法连接:" . curl_strerror($curlError); } else if ($httpCode >= 200 && $httpCode < 300) { echo "URL存在"; } else { echo "URL无效或无法访问,状态码:" . $httpCode; } ?>
说明:
- 加入
CURLOPT_NOBODY只获取响应头部,提升效率; - 增加超时设置,避免阻塞;
- 检查curl错误码,处理连接失败场景;
- 判断2xx状态码为有效URL,覆盖所有成功场景。
get_headers代码问题及修复
你的get_headers代码问题在于:
- 错误抑制导致排查困难:用
@抑制了get_headers的错误,若php.ini中allow_url_fopen未开启,函数会直接返回false,但你看不到错误信息; - strpos判断逻辑不严谨:
strpos找到匹配时会返回索引位置(数字),若索引为0会被if判定为false,虽然正常HTTP状态行中200不会在索引0,但严谨性不足,应该用!== false判断是否存在。
修正后的代码:
<?php $url = "https://www.geeksforgeeks.org"; // 先检查allow_url_fopen是否开启 if (!ini_get('allow_url_fopen')) { echo "allow_url_fopen未开启,无法使用get_headers"; exit; } $headers = get_headers($url); if ($headers !== false && strpos($headers[0], '200') !== false) { $status = "URL Exist"; } else { $status = "URL Doesn't Exist"; } echo($status); ?>
说明:
- 移除错误抑制符
@,便于排查问题; - 先检查
allow_url_fopen配置,该配置是get_headers正常工作的前提; - 用
!== false严格判断strpos的结果,避免索引0被误判为false。
总结
PHP 7.4中的cURL和get_headers工具均未失效,你的问题是代码逻辑漏洞导致的。优先推荐使用cURL方案,因为它不受allow_url_fopen配置限制,且对网络请求的控制更灵活。
内容的提问来源于stack exchange,提问作者Dylan Grech
相关产品推荐
相关产品推荐

