Проблема с использованием неблокирующих сокетов

Статус
В этой теме нельзя размещать новые ответы.

Troll

Новичок
Проблема с использованием неблокирующих сокетов

Мне нужно написать скрипт, который загружает контент некоторого кол-ва страниц.
Т.к. скорость с различными хостами очень разная и время генерации этих страниц на сервере тоже может быть очень разное, то было бы логично использовать асинхронные сокеты, чтобы не ждать медленные страницы.
Т.е. код для загрузки страниц с адресами будет выглядеть примерно так :
PHP:
function multiHTTP ($urlArr) {
 $sockets = Array(); // socket array!
 $urlInfo = Array(); // info arr
 $retDone = Array();
 $retData = Array();
 $errno  = Array();
 $errstr  = Array();
 for ($x=0;$x<count($urlArr);$x++) {
  $urlInfo[$x] = parse_url($urlArr[$x]);
  $urlInfo[$x][port] = ($urlInfo[$x][port]) ? $urlInfo[$x][port] : 80;
  $urlInfo[$x][path] = ($urlInfo[$x][path]) ? $urlInfo[$x][path] : "/";
  $sockets[$x] = fsockopen($urlInfo[$x][host], $urlInfo[$x][port],
                           $errno[$x], $errstr[$x], 30);
  socket_set_blocking($sockets[$x],FALSE);
  $query = ($urlInfo[$x][query]) ? "?" . $urlInfo[$x][query] : "";
  fputs($sockets[$x],"GET " . $urlInfo[$x][path] . "$query HTTP/1.0\r\nHost: " .
       $urlInfo[$x][host] . "\r\n\r\n");
 }
 // ok read the data from each one
 $done = false;
 while (!$done) {
  for ($x=0; $x < count($urlArr);$x++) {
   if (!feof($sockets[$x])) {
   if ($retData[$x]) {
     $retData[$x] .= fgets($sockets[$x],128);
   } else {
     $retData[$x] = fgets($sockets[$x],128);
   }
   } else {
   $retDone[$x] = 1;
   }
  }
  $done = (array_sum($retDone) == count($urlArr));
 }
 return $retData;
}
код взят с http://ru.php.net/manual/en/function.fsockopen.php

Т.к. страницы грузятся ловольно медленно, то, чтобы не гонять проц без толку, было бы логично поставить в конец кадой итерации цикла
while (!$done)
что- нибудь вроде
sleep(задержка)

Но даже при указании такой задержки в 1 микросекунду скрипт замедляется вдвое!
Если же указать норм. задержку в 1000 микросекунд, то вообще умирает.
Насколько я понял, дело в том, что когда процесс "спит", он почему- то перестает получать данные с сокетов.
Более того, я пробовал вместо
sleep()
вставлять какой- нибудь большой цикл типа
PHP:
for ($k = 0; $k < 100000; $k++) 
md5($k);
(имитация некоторой обработки контента уже загруженных страниц)
время его выполнения примерно 0.2 сек
Результат тот же!!!

Может нужно сокет как- то еще настроить?

если кто- то знает в чем дело, помогите плиз!
 

Troll

Новичок
нет, пытаемся писать курсовую потихоньку
под обработкой контента страницы имеется в виду ее индексация
 

Troll

Новичок
чтобы страницы параллельно грузились + если какая- то страница очень долго формируется на сервере, то чтобы во время ожидания от него ответа можно было грузить другие
 

hermit_refined

Отшельник
чтобы страницы параллельно грузились
ну это понятно. только куда спешить (мы же ведь об индексации, а объем наверняка небольшой, в лес никто не убежит)? зачем лишнюю нагрузку на сервер создавать?..
 

Troll

Новичок
скорость загрузки больше гораздо, а сервер от этого особо не нагружается - ему ведь надо только сокеты открыть и слушать потом
 

Фанат

oncle terrible
Команда форума
а о том сервере, который ты опрашиваешь - ты подумал?
он и так долго страницу формирует, а ты его ещё больше нагружаешь. Этак ты его вообще положишь.

В общем, пиши-ка свою курсовую по индексации, человек с говорящим ником, и не заморачивайся.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху