php fsockopen fgets становятся слишком медленными - PullRequest
0 голосов
/ 23 июля 2011

У меня возникла проблема, когда я пытался использовать 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
……

Мне действительно интересно, почему для получения всего 219 байт данных требуется 2 секунды. Это слишком медленно.Чтобы получить всю страницу, включая сотни итераций, она тратит 40 секунд.Принимая во внимание, что если вы используете Firefox, это всего лишь секунда ..

Я хочу знать, почему Fgets становятся слишком медленными.

Спасибо за чтение.

1 Ответ

0 голосов
/ 23 июля 2011

не в моей голове: возможно ли, что соединение остается открытым, потому что вы используете запрос HTTP / 1.1?это заставит сервер ждать, пока вы сделаете еще один запрос, затем закроет соединение, если ничего не найдено (взято как тайм-аут).кроме того, ваша операционная система может буферизовать данные (SO_RCVLOWAT socket_option), поэтому чтение заканчивается, когда веб-сервер закрывает соединение.

попробуйте уменьшить объем данных, которые должны быть прочитаны (например, 128 байтов) внутри циклаи посмотрим, что получится.кроме этого (и связанного с этим), вы можете попробовать прочитать это: http://ar.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endings

php может не очень хорошо читать EOL's

...