【发布时间】:2013-03-20 09:57:49
【问题描述】:
我继承了一段代码,它使用下面的 fetchURL() 函数从 url 中获取数据。我刚刚注意到,在检索到整页数据之前,它经常让feof() 返回 true。我尝试了一些测试,并使用file_get_contents() 的CURL 每次都检索整个页面。
错误是间歇性的。 在 9 次调用中,有时 7 次会成功完成,有时只会成功完成 4 次。9 个中的特定 4 个(它们是带有更改查询字符串的获取请求)总是成功完成。我尝试颠倒顺序请求和相同的 4 个查询字符串仍然始终成功,而其余的有时有效,有时无效。
因此,“似乎”返回的数据可能与问题有关,但让我感到困惑的是间歇性。在每种情况下返回的数据总是相同的(例如,每次我使用?SearchString=8502806 的查询字符串进行调用时,返回的页面都包含相同的数据),但有时整个页面由fgets/feof 提供,有时不是。
有人对可能导致这种情况的原因提出建议吗? O 在这个主题上看到的大多数其他帖子都是关于 feof() 没有返回 true 的相反问题。
function fetchURL( $url, $ret = 'body' ) {
$url_parsed = parse_url($url);
$host = $url_parsed["host"];
$port = (isset($url_parsed["port"]))?$url_parsed["port"]:'';
if ($port==0)
$port = 80;
$path = $url_parsed["path"];
if ($url_parsed["query"] != "")
$path .= "?".$url_parsed["query"];
$out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
$fp = fsockopen($host, $port, $errno, $errstr, 30);
fwrite($fp, $out);
$body = false;
$h = '';
$b = '';
while (!feof($fp)) {
$s = fgets($fp, 1024);
if ( $body )
$b .= $s;
else
$h .= $s;
if ( $s == "\r\n" )
$body = true;
}
fclose($fp);
return ($ret == 'body')?$b:(($ret == 'head')?$h:array($h, $b));
}
【问题讨论】:
-
feof在套接字上通常(总是?)一个坏主意,因为它会等待服务器在继续之前实际关闭套接字。至少你也应该发送Connection: close标头,但我强烈建议完全重写这段代码,因为它很糟糕(无意侮辱)。 -
我正计划转换为 CURL,但我想知道可能导致我看到的问题的原因。因此问题。