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

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

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 сек
Результат тот же!!!

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

если кто- то знает в чем дело, помогите плиз!
 
нет, пытаемся писать курсовую потихоньку
под обработкой контента страницы имеется в виду ее индексация
 
чтобы страницы параллельно грузились + если какая- то страница очень долго формируется на сервере, то чтобы во время ожидания от него ответа можно было грузить другие
 
чтобы страницы параллельно грузились
ну это понятно. только куда спешить (мы же ведь об индексации, а объем наверняка небольшой, в лес никто не убежит)? зачем лишнюю нагрузку на сервер создавать?..
 
скорость загрузки больше гораздо, а сервер от этого особо не нагружается - ему ведь надо только сокеты открыть и слушать потом
 
а о том сервере, который ты опрашиваешь - ты подумал?
он и так долго страницу формирует, а ты его ещё больше нагружаешь. Этак ты его вообще положишь.

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