[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с асинхронными сокетами
capitanclaw
Добрый день!

Возникла проблема, которую не могу разрешить: Есть скрипт, который загружает веб страницы с помощью асинхронных сокетов. Но этот скрипт не умеет определять конец у некоторых 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);
}
        
?>


Этот скрипт у меня выдает следующее:
Цитата
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



Некоторые странички нормально загружаются, а некоторые вот так...

В чем может быть проблема?? angry.gif



Спустя 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]
В чем может быть проблема?? angry.gif


Причина обнаружилась в том что codeproject слал в хедерах Connection: Keep-Alive

Добавление строчки Connection: Close в запрос решило проблему acute.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.