0

fetchURL()以下の関数を使用して URL からデータを取得するコードを継承しました。feof()データのページ全体が取得される前に、true が返されることが多いことに気付きました。私はいくつかのテストを試みましたCURLが、file_get_contents()両方を使用して毎回完全なページを取得しました。

エラーは断続的です。9 回の呼び出しでは、7 回が正常に完了する場合もあれば、4 回しか完了しない場合もあります。9 回のうち特定の 4 回 (クエリ文字列が変化するだけの get 要求) は、常に正常に完了します。リクエストの順序を逆にしてみましたが、同じ 4 つのクエリ文字列は常に成功しますが、残りは機能する場合と機能しない場合があります。
したがって、返されるデータが問題に関係しているように見えますが、断続的な性質が私を悩ませています。いずれの場合も返されるデータは常に同じですが (返されるページのクエリ文字列を使用して呼び出しを行うたびに?SearchString=8502806、同じデータが含まれます)、ページ全体が配信される場合と配信されfgets/feofない場合があります。

この状況の原因について誰か提案がありますか? Oがこの件に関して見た他のほとんどの投稿は、feof()真を返さないという反対の問題に関するものです。

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

I see quite a few things wrong with that code.

  • Don't ever use feof on sockets. It'll hang until the server closes the socket, which does not necessarily happen immediately after the page was received.
  • feof might return true (socket is closed) while PHP still has some data in its buffer.
  • Your code to distinguish header from body seems to rely on PHP doing it's job properly, which is generally a bad idea. fgets doesn't necessarily read a line, it can also return just a single byte (\r, then the next call you might get the \n)
  • You're not properly encoding the path value

Why don't you just convert your code to use cURL or file_get_contents?

于 2013-03-29T19:57:13.897 に答える
-1

私にはタイムアウトの問題のように思えます。PHP マニュアルのstream_set_timeout()を参照してください。

于 2013-03-29T19:53:18.733 に答える