【问题标题】:Why my code returns an http 0 response instead of expected 200?为什么我的代码返回 http 0 响应而不是预期的 200?
【发布时间】:2019-01-06 02:00:09
【问题描述】:

我有一个 php 函数,可以检查 URL 列表是否仍然存在(检查 HTTP 状态代码),它运行良好。无法访问 URL 时,显示的状态代码为“0”(例如:http://81.200.15.122/mjpg/video.mjpg)。但在某些情况下,即使 URL 是活动的,响应也是“0”。

例如,此 URL 有效,但我的代码返回“0”HTTP 状态代码:http://81.149.56.38:8083/mjpg/video.mjpg

如果我使用在线 HTTP 检查器 (https://www.portcheckers.com/http-header-check),它会确认状态代码应为 200。 我认为这个问题可能与它是一个 mjpg 视频流 URL 的事实有关,但是这个其他类似的 URL 返回了预期的 200 状态代码:http://204.195.155.5/mjpg/video.mjpg

代码如下:

function get_response($url) {
    $handles = curl_init($url);
    curl_setopt($handles, CURLOPT_NOBODY, true);
    curl_setopt($handles, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($handles, CURLOPT_TIMEOUT, 1);
    curl_exec($handles);
    $httpresponse = curl_getinfo($handles, CURLINFO_HTTP_CODE);
    echo ("http status code: ". $httpresponse);
}

感谢您的帮助。

【问题讨论】:

  • 在我看来这可能是超时问题。 curl 有两个选项:CURLOPT_CONNECTTIMEOUT - 尝试连接时等待的秒数。使用 0 无限期等待。 CURLOPT_TIMEOUT - 允许 cURL 函数执行的最大秒数。
  • 我同意@PatrickSimard。我已经测试了您的代码和类似$ curl -Is http://81.149.56.38:8083/mjpg/video.mjpg | head -n 1 的命令,最终都返回 200 或 0。根据您的需要,尝试增加超时,忽略一些 0 结果或修复超时
  • 由于增加超时不能解决我的问题,我还尝试使用以下方法检查 URL 是否返回一些内容:<?php $section = file_get_contents('http://81.149.56.38:8083/mjpg/video.mjpg', FALSE, NULL, 20, 14); var_dump($section); ?> 但它也返回没有内容......

标签: php


【解决方案1】:

cURL 在超时时返回 0。一些 URL 的延迟时间可能比其他 URL 高。如果 cURL 达到超时,它将返回 0,因为查询不完整。

function get_response($url) {
    $handles = curl_init($url);
    curl_setopt($handles, CURLOPT_NOBODY, true);
    curl_setopt($handles, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($handles, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($handles, CURLOPT_TIMEOUT, 30);
    curl_exec($handles);
    $httpresponse = curl_getinfo($handles, CURLINFO_HTTP_CODE);
    echo ("http status code: ". $httpresponse);
}

更改值以优化您的代码。您应该在 cron 中运行它并将结果保存在您的 sql 表中以避免减慢页面速度。您还可以添加“上次扫描 1 小时前”或类似内容。用户将立即获得列表服务,服务器端将有充足的时间查询每个 url。

【讨论】:

  • 感谢您的建议。但即使有非常大的超时值,我仍然得到一个 0。我查看了其他可能有帮助的 curl 选项,但没有找到任何东西。
【解决方案2】:

我终于找到了问题所在:我的托管服务器防火墙关闭了一些端口,不允许响应某些 URL。

【讨论】:

  • 在这种情况下,curl_getinfo() 将返回 false,而不是 0
猜你喜欢
  • 2012-03-09
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多