0

我继承了一段代码,它使用fetchURL()下面的函数从 url 中获取数据。我刚刚注意到,feof()在检索到整页数据之前,它通常会返回 true。我已经尝试了一些测试,并且每次都使用这两种方法CURL来检索整个页面。file_get_contents()

错误是间歇性的。在 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));
}
4

2 回答 2

2

我看到该代码有很多问题。

  • 永远不要feof在套接字上使用。它会一直挂起,直到服务器关闭套接字,这不一定会在收到页面后立即发生。
  • feof可能会返回true(套接字已关闭),而 PHP 在其缓冲区中仍有一些数据。
  • 您区分标头和正文的代码似乎依赖于 PHP 正确地完成它的工作,这通常是一个坏主意。fgets不一定读取一行,它也可以只返回一个字节 ( \r,然后下一个调用你可能会得到\n)
  • 您没有正确编码路径值

为什么不直接将代码转换为使用 cURL 或 file_get_contents?

于 2013-03-29T19:57:13.897 回答
-1

对我来说,这听起来像是一个超时问题。请参阅PHP 手册中的stream_set_timeout()

于 2013-03-29T19:53:18.733 回答