当我尝试使用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变得太慢的原因。
感谢您的阅读。
答案 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的