【问题标题】:get_headers is unreliable in this case. Any way around it?get_headers 在这种情况下是不可靠的。有什么办法吗?
【发布时间】:2013-03-09 05:10:59
【问题描述】:

我正在使用以下内容来检查页面是否存在。

for($i = 620; $i <= 630; $i++) 
{
    $url = 'http://fantasy.mlssoccer.com/web/api/elements/'.$i.'/';
    $headers = @get_headers($url);  
    echo $headers[0].'<br>';
}

有时这会给出 10 个 HTTP/1.1 200 OK 而其他时候最后 5 个是 HTTP/1.1 500 Internal Server Error

有没有办法解决这个问题?如果你访问 625 之后的页面并刷新,你会得到一个以500 Internal Server Error nginx 开头的页面,或者有时你会得到一个以Piston/0.2.2 (Django 1.4.4) crash report: 开头的页面。

知道如何检查发生这种情况时是否存在(有效的非崩溃)页面吗?

【问题讨论】:

  • get_headers 不是不可靠,你点击的网站是。
  • 我刚刚尝试使用 i=625 访问上述站点并收到 500 错误。好像是服务器端的问题。
  • @jordanm 措辞选择不当,但你知道我的意思。我不能相信它会按原样工作。
  • 定义“如果 URL 存在”。你可以形成它——所以在这个意义上它存在——但服务器没有提供有效的响应。我认为这意味着“此时服务器无法找到使用您的统一资源定位器请求的资源”。我会称之为“该 URL 不存在”。
  • 我建议您使用get_headers() 来获取站点的标题并测试HTTP 状态代码是否可以接受(200 是OK,301 表示永久移动,有一个完整的列表维基百科)。如果服务器有无法解决的问题,它会发送500 状态; 401 表示该资源不存在。哦等等,你已经想通了。有什么问题?

标签: php mysql http-headers


【解决方案1】:

将不同人所说的总结成一个独立的 php 脚本(这可以从命令行工作 - 我相信你可以让它在网页中工作):

<?php
for($i = 620; $i <= 630; $i++)
{
    $url = 'http://fantasy.mlssoccer.com/web/api/elements/'.$i.'/';
    $headers = @get_headers($url);
    $match = preg_grep("/200 OK/", $headers);
    if (strlen($match[0]) == 0) {
      echo "page ".$i." does not exist!\n";
    }
    else {
      echo "page ".$i." exists!\n";
    }
}
?>

这刚刚产生了以下输出:

floris$ php valid.php 
page 620 exists!
page 621 exists!
page 622 exists!
page 623 exists!
page 624 exists!
page 625 does not exist!
page 626 does not exist!
page 627 does not exist!
page 628 does not exist!
page 629 does not exist!
page 630 does not exist!

【讨论】:

  • 一个简单的strpos() 测试就可以了。
  • 感谢@JaredFarrish - 我在这么多语言之间来回穿梭,以至于我经常忽略显而易见的事情。
  • @Floris 非常感谢你,很抱歉之前有点糟糕。这个问题让我很沮丧,而且已经很晚了,所以我有点暴躁。似乎工作得很好。
  • 不用担心 - 每个人都需要不时服药......很高兴我们解决了这个问题。也向 Jared 大喊一声!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 2020-04-21
  • 2019-10-15
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 2016-05-12
相关资源
最近更新 更多