2011-07-23 37 views
0

我,當我試圖使用的fsockopen並與fgets得到一個網頁的內容的問題。我可以很容易地從Web服務器接收的標題如下:PHP的fsockopen與fgets變得太慢

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 

我的代碼如下:

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

輸出是這樣的:

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

我真的不知道爲什麼需要2秒才能得到219字節的數據,這太慢了。 爲了獲得整個頁面,包括數百個fgets迭代,它花費40秒。而如果你使用Firefox,它只是一個第二..

我想知道是什麼原因導致的與fgets變得太慢。

感謝您的閱讀。

+0

嗯,多少時間'的file_get_contents(「www.abc.com」 )'? – Zyava

+0

您是否找到@ cn2500的解決方案? –

回答

0

出前我的頭:這是可能的連接,因爲您使用的是HTTP/1.1請求保持開放?這將使服務器等待你發出另一個請求,如果沒有找到(作爲超時),則然後關閉連接。除此之外,您的操作系統可能會緩存數據(SO_RCVLOWAT socket_option),以便在Web服務器關閉連接時讀取結束。

嘗試減少的數據的量將被讀取的環的內側(如128字節),看看會發生什麼。比其他(以及與此相關的),你可能會想嘗試閱讀本:http://ar.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings

PHP可能不是很好讀的EOL的