php fsockopen fgets变得太慢了

时间:2011-07-23 11:23:11

标签: php performance header fgets fsockopen

当我尝试使用fsockopen和fgets来获取网页内容时,我遇到了问题。我可以轻松地从Web服务器接收标题,如下所示:

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变得太慢的原因。

感谢您的阅读。

1 个答案:

答案 0 :(得分: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的