Возникла проблема, которую не могу разрешить: Есть скрипт, который загружает веб страницы с помощью асинхронных сокетов. Но этот скрипт не умеет определять конец у некоторых html страниц, в частности от codeproject, в результате чего получается бесконечный цикл.
Синтетический тест:
Код
<?
set_time_limit(200);
$site = "http://www.codeproject.com/KB/database/relationaladonet.aspx";
$url = parse_url($site);
$socket = stream_socket_client($url["host"].":"."80", $errno, $errstr, 100,
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
$contents = array();
$write = array($socket);
$read = array();
while (TRUE)
{
$n = stream_select($read, $write, $e = null, 2);
if ($n > 0)
{
// чтение
foreach ($read as $r)
{
$text = fread($r, 8096);
echo date("H:i:s")." Chunk len:".strlen($text)."<br />";
flush();
// если все данные получены
if (strlen($text) == 0)
{
echo "Complete!<br />";
echo $content;
die();
}
}
// запись
foreach ($write as $w)
{
fwrite($w, "GET ".$url["path"]." HTTP/1.1\r\nHost: ".$url["host"]."\r\n\r\n");
}
}
else
{
// Данных нету - спим спокойно
Sleep(1);
echo date("H:i:s")." Zzz...<br />";
}
// Пишем один раз
$write = array();
$read = array($socket);
}
?>
set_time_limit(200);
$site = "http://www.codeproject.com/KB/database/relationaladonet.aspx";
$url = parse_url($site);
$socket = stream_socket_client($url["host"].":"."80", $errno, $errstr, 100,
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
$contents = array();
$write = array($socket);
$read = array();
while (TRUE)
{
$n = stream_select($read, $write, $e = null, 2);
if ($n > 0)
{
// чтение
foreach ($read as $r)
{
$text = fread($r, 8096);
echo date("H:i:s")." Chunk len:".strlen($text)."<br />";
flush();
// если все данные получены
if (strlen($text) == 0)
{
echo "Complete!<br />";
echo $content;
die();
}
}
// запись
foreach ($write as $w)
{
fwrite($w, "GET ".$url["path"]." HTTP/1.1\r\nHost: ".$url["host"]."\r\n\r\n");
}
}
else
{
// Данных нету - спим спокойно
Sleep(1);
echo date("H:i:s")." Zzz...<br />";
}
// Пишем один раз
$write = array();
$read = array($socket);
}
?>
Этот скрипт у меня выдает следующее:
Цитата
15:55:06 Zzz...
15:55:06 Chunk len:8096
15:55:06 Chunk len:8096
15:55:06 Chunk len:8096
15:55:06 Chunk len:8096
15:55:06 Chunk len:3496
15:55:07 Chunk len:4140
15:55:07 Chunk len:4380
15:55:07 Chunk len:1140
15:55:07 Chunk len:4140
15:55:07 Chunk len:1380
15:55:08 Chunk len:6900
15:55:10 Chunk len:6900
15:55:10 Chunk len:4140
15:55:11 Chunk len:4140
15:55:11 Chunk len:2760
15:55:11 Chunk len:4140
15:55:12 Chunk len:1380
15:55:12 Chunk len:4140
15:55:12 Chunk len:4140
15:55:13 Chunk len:4140
15:55:13 Chunk len:1380
15:55:13 Chunk len:5520
15:55:16 Zzz...
15:55:16 Chunk len:6900
15:55:17 Chunk len:1380
15:55:18 Chunk len:2760
15:55:19 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:1841
15:55:23 Zzz...
15:55:26 Zzz...
15:55:29 Zzz...
15:55:32 Zzz...
15:55:35 Zzz...
15:55:38 Zzz...
15:55:41 Zzz...
15:55:44 Zzz...
15:55:47 Zzz...
15:55:50 Zzz...
15:55:53 Zzz...
15:55:56 Zzz...
15:55:59 Zzz...
15:56:02 Zzz...
15:56:05 Zzz...
15:56:08 Zzz...
15:56:11 Zzz...
15:56:14 Zzz...
15:56:17 Zzz...
15:56:20 Zzz...
15:56:23 Zzz...
15:56:26 Zzz...
15:56:29 Zzz...
15:56:32 Zzz...
15:56:35 Zzz...
15:56:38 Zzz...
15:56:41 Zzz...
15:56:44 Zzz...
15:56:47 Zzz...
15:56:50 Zzz...
15:56:53 Zzz...
15:56:56 Zzz...
15:56:59 Zzz...
15:57:02 Zzz...
15:57:05 Zzz...
15:57:08 Zzz...
15:57:11 Zzz...
15:57:14 Zzz...
15:57:17 Zzz...
15:57:20 Zzz...
15:57:23 Zzz...
15:57:26 Zzz...
15:57:29 Zzz...
15:57:32 Zzz...
15:57:35 Zzz...
15:57:38 Zzz...
15:57:41 Zzz...
15:57:44 Zzz...
15:57:47 Zzz...
15:57:50 Zzz...
15:57:53 Zzz...
15:57:56 Zzz...
15:57:59 Zzz...
15:58:02 Zzz...
15:58:05 Zzz...
15:58:08 Zzz...
15:58:11 Zzz...
15:58:14 Zzz...
15:58:17 Zzz...
15:58:20 Zzz...
Fatal error: Maximum execution time of 200 seconds exceeded in n:\home\test1.ru\www\minitest.php on line 43
15:55:06 Chunk len:8096
15:55:06 Chunk len:8096
15:55:06 Chunk len:8096
15:55:06 Chunk len:8096
15:55:06 Chunk len:3496
15:55:07 Chunk len:4140
15:55:07 Chunk len:4380
15:55:07 Chunk len:1140
15:55:07 Chunk len:4140
15:55:07 Chunk len:1380
15:55:08 Chunk len:6900
15:55:10 Chunk len:6900
15:55:10 Chunk len:4140
15:55:11 Chunk len:4140
15:55:11 Chunk len:2760
15:55:11 Chunk len:4140
15:55:12 Chunk len:1380
15:55:12 Chunk len:4140
15:55:12 Chunk len:4140
15:55:13 Chunk len:4140
15:55:13 Chunk len:1380
15:55:13 Chunk len:5520
15:55:16 Zzz...
15:55:16 Chunk len:6900
15:55:17 Chunk len:1380
15:55:18 Chunk len:2760
15:55:19 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:4140
15:55:20 Chunk len:1841
15:55:23 Zzz...
15:55:26 Zzz...
15:55:29 Zzz...
15:55:32 Zzz...
15:55:35 Zzz...
15:55:38 Zzz...
15:55:41 Zzz...
15:55:44 Zzz...
15:55:47 Zzz...
15:55:50 Zzz...
15:55:53 Zzz...
15:55:56 Zzz...
15:55:59 Zzz...
15:56:02 Zzz...
15:56:05 Zzz...
15:56:08 Zzz...
15:56:11 Zzz...
15:56:14 Zzz...
15:56:17 Zzz...
15:56:20 Zzz...
15:56:23 Zzz...
15:56:26 Zzz...
15:56:29 Zzz...
15:56:32 Zzz...
15:56:35 Zzz...
15:56:38 Zzz...
15:56:41 Zzz...
15:56:44 Zzz...
15:56:47 Zzz...
15:56:50 Zzz...
15:56:53 Zzz...
15:56:56 Zzz...
15:56:59 Zzz...
15:57:02 Zzz...
15:57:05 Zzz...
15:57:08 Zzz...
15:57:11 Zzz...
15:57:14 Zzz...
15:57:17 Zzz...
15:57:20 Zzz...
15:57:23 Zzz...
15:57:26 Zzz...
15:57:29 Zzz...
15:57:32 Zzz...
15:57:35 Zzz...
15:57:38 Zzz...
15:57:41 Zzz...
15:57:44 Zzz...
15:57:47 Zzz...
15:57:50 Zzz...
15:57:53 Zzz...
15:57:56 Zzz...
15:57:59 Zzz...
15:58:02 Zzz...
15:58:05 Zzz...
15:58:08 Zzz...
15:58:11 Zzz...
15:58:14 Zzz...
15:58:17 Zzz...
15:58:20 Zzz...
Fatal error: Maximum execution time of 200 seconds exceeded in n:\home\test1.ru\www\minitest.php on line 43
Некоторые странички нормально загружаются, а некоторые вот так...
В чем может быть проблема??
Спустя 57 минут, 5 секунд (31.01.2008 - 17:17) vasa_c написал(а):
А если через fSockOpen() и с fEof() ?
Спустя 1 час, 3 минуты, 53 секунды (31.01.2008 - 18:20) capitanclaw написал(а):
Цитата(capitanclaw @ 31.1.2008, 13:19) [snapback]32921[/snapback]
В чем может быть проблема??
Причина обнаружилась в том что codeproject слал в хедерах Connection: Keep-Alive
Добавление строчки Connection: Close в запрос решило проблему