在 PHP 中测试 404 的 URL 的简单方法?

新手上路,请多包涵

我正在自学一些基本的抓取,我发现有时我输入到我的代码中的 URL 会返回 404,这会弄乱我的所有其余代码。

所以我需要在代码顶部进行测试,以检查 URL 是否返回 404。

这似乎是一项非常简单的任务,但谷歌没有给我任何答案。我担心我在寻找错误的东西。

一个博客推荐我使用这个:

 $valid = @fsockopen($url, 80, $errno, $errstr, 30);

然后测试看看 $valid 是否为空。

但我认为给我带来问题的 URL 上有一个重定向,所以 $valid 对于所有值都是空的。或者也许我做错了什么。

我还研究了一个“头部请求”,但我还没有找到任何我可以玩或尝试的实际代码示例。

建议?这和 curl 有什么关系?

原文由 bflora 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 932
2 个回答

如果您使用的是 PHP 的 curl 绑定,您可以使用 curl_getinfo 检查错误代码,如下所示:

 $handle = curl_init($url);
curl_setopt($handle,  CURLOPT_RETURNTRANSFER, TRUE);

/* Get the HTML or whatever is linked in $url. */
$response = curl_exec($handle);

/* Check for 404 (file not found). */
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
    /* Handle 404 here. */
}

curl_close($handle);

/* Handle $response here. */

原文由 strager 发布,翻译遵循 CC BY-SA 2.5 许可协议

此函数返回 PHP 7 中 URL 的状态码:

 /**
 * @param string $url
 * @return bool
 */
function isHttpStatusCode200(string $url): bool
{
    return getHttpResponseCode($url) === 200;
}

/**
 * @param string $url
 * @return int
 */
function getHttpResponseCode(string $url): int
{
    $headers = get_headers($url);
    return substr($headers[0], 9, 3);
}

例子:

 echo isHttpStatusCode200('https://www.google.com');
//displays: true

原文由 Sebastian Viereck 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题