php检测网址是否有效

用PHP判断一个网址能不能访问,测网最直接的址否办法就是拿get_headers()去砸它一下。这函数会返回服务器响应的有效头信息,里面藏着HTTP状态码,测网比如200代表正常,址否404代表页面不存在。有效看状态码是测网否以“2”或“3”开头,基本就能断定链接是址否否活着。

写起来也就几行代码的有效事:

$url = 'https://example.com'; $headers = @get_headers($url); if ($headers && strpos($headers[0], '200')) {  echo '网址有效'; } else {  echo '网址无效'; } 

用@符号压制掉警告,因为如果域名压根不存在,测网get_headers()会甩给你一个“failed to open stream”的址否报错,挺烦人的有效。但这里有个坑——你拿到的测网$headers[0]可能是“HTTP/1.1 301 Moved Permanently”,这其实是址否重定向,网站本身是有效通的。所以判断条件最好放宽点,用正则匹配状态码在200到399之间都算有效。

不过get_headers()有个致命弱点:它会完整下载响应头,遇到响应慢的服务器,脚本会卡在那里等。我遇到过抓一个老旧的政府网站,等了整整30秒才超时。要是你写的是爬虫或者批量检测工具,这种效率完全没法忍。

更优雅的方案是改用cURL,它能控制超时时间,还能只拿头部不下载正文。像这样:

$ch = curl_init($url); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); 

5秒超时,拿不到响应就判定失效,这才是干活的样子。CURLINFO_HTTP_CODE会直接给你数字状态码,不用去解析字符串。

但这里又有个新问题——有些网站会故意屏蔽非浏览器请求,你拿cURL去访问,它给你返回403。这时候得伪装一下User-Agent,把自己打扮成Chrome浏览器。我试过某个电商平台的反爬机制,不设置UA直接拒绝连接,加了UA后立马放行。

还有一个容易被忽略的细节:网址可能带着中文或特殊字符,比如https://例子.测试/路径?name=张三。直接扔给cURL会报错,得先用urlencode()处理参数部分,或者用idn_to_ascii()把中文域名转成punycode编码。

检测网址有效性这事,光看状态码也不够周全。有些服务器不管什么路径都返回200,比如单页应用,你随便拼个不存在的路由它也给你200。这时候就得看响应内容了——用cURL把正文也拉下来,检查是否有特定关键词,或者判断Content-Length是否超过某个阈值。我之前测一个新闻网站,删除的文章链接返回200但正文区域是空的,内容长度只有几百字节,明显是异常。

说句实在话,没有一种检测方法是绝对完美的。最稳妥的做法是组合拳:先快速用cURL探状态码,遇到可疑的再拉正文验证,最后用正则匹配页面标题或关键内容。这套流程下来,误判率能降到5%以下。

写代码时记得把检测逻辑封装成函数,参数带上超时时间和是否跟踪重定向。别在全局作用域里裸奔写测试代码,不然以后维护起来想骂人。