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));
}