2011-07-23 42 views
0

fsockopenとfgetsを使ってWebページのコンテンツを取得しようとしたときに問題が発生しました。私は簡単に次のようにWebサーバからヘッダを受け取ることができます:私は本当に疑問に思ってphp fsockopen fgetsが遅すぎる

…… 
fgets start at 12:23:45 
219 
Fgets end at 12:23:47 
…… 

$fp = @fsockopen(“www.abc.com”, 80, $errno, $errstr, 30); 
fwrite($fp, $request);//$request is my predefined header including path and cookies 
$lines=””; 
while (!feof($fp)) 
{ 
    Echo “fgets start at ”.date(“H:i:s”).”\n”; 
    $line = fgets($fp, 4096); 
    Echo strlen($line) .”\n”; 
    Echo “fgets end at ”.date(“H:i:s”) .”\n”; 
    $lines +=$line; 
} 
fclose($fp); 

出力は、そのようなものだった:

HTTP/1.1 200 OK 
[cache-control] => private 
[content-type] => text/plain; charset=utf-8 
[server] => Microsoft-IIS/7.0 
[x-aspnet-version] => 2.0.50727 
[x-powered-by] => ASP.NET 
[date] => Sat, 23 Jul 2011 10:36:57 GMT 
[connection] => close 
[content-length]=> 30072 
[vary] => Accept-Encoding [content-encoding] => gzip 

私のコードは以下の通りですわずか219バイトのデータを取得するのに2秒かかります。 数百回のfgets繰り返しを含むページ全体を取得するには、40秒を費やします。あなたがfirefoxを使うのであれば、ちょっと待ってください。

fgetsが遅すぎる原因を知りたいのですが。

読んでいただきありがとうございます。

+0

うーんを、読んでいない可能性があります) '? – Zyava

+0

この@ cn2500の解決策を見つけましたか? –

答えて

0

out of my head:HTTP/1.1リクエストを使用しているため、接続が開いたままになっている可能性はありますか?これにより、サーバーは別の要求を行うのを待ちます。次にが見つからない場合は接続をクローズします(タイムアウトとみなされます)。それ以外に、オペレーティングシステムがデータをバッファリングしている可能性があります(SO_RCVLOWAT socket_option)ので、Webサーバーが接続を閉じると読み取りが終了します。

ループ内で読み取るデータ量(128バイトなど)を減らし、何が起こるかを確認してください。それ以外の(およびこれに関連する)、あなたはこれを読んしようとする場合があります:http://ar.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings

PHPはよく `のfile_get_contents(「www.abc.com」かかる時間EOLの