Troll
Новичок
Проблема с использованием неблокирующих сокетов
Мне нужно написать скрипт, который загружает контент некоторого кол-ва страниц.
Т.к. скорость с различными хостами очень разная и время генерации этих страниц на сервере тоже может быть очень разное, то было бы логично использовать асинхронные сокеты, чтобы не ждать медленные страницы.
Т.е. код для загрузки страниц с адресами будет выглядеть примерно так :
код взят с http://ru.php.net/manual/en/function.fsockopen.php
Т.к. страницы грузятся ловольно медленно, то, чтобы не гонять проц без толку, было бы логично поставить в конец кадой итерации цикла
while (!$done)
что- нибудь вроде
sleep(задержка)
Но даже при указании такой задержки в 1 микросекунду скрипт замедляется вдвое!
Если же указать норм. задержку в 1000 микросекунд, то вообще умирает.
Насколько я понял, дело в том, что когда процесс "спит", он почему- то перестает получать данные с сокетов.
Более того, я пробовал вместо
sleep()
вставлять какой- нибудь большой цикл типа
(имитация некоторой обработки контента уже загруженных страниц)
время его выполнения примерно 0.2 сек
Результат тот же!!!
Может нужно сокет как- то еще настроить?
если кто- то знает в чем дело, помогите плиз!
Мне нужно написать скрипт, который загружает контент некоторого кол-ва страниц.
Т.к. скорость с различными хостами очень разная и время генерации этих страниц на сервере тоже может быть очень разное, то было бы логично использовать асинхронные сокеты, чтобы не ждать медленные страницы.
Т.е. код для загрузки страниц с адресами будет выглядеть примерно так :
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;
}
Т.к. страницы грузятся ловольно медленно, то, чтобы не гонять проц без толку, было бы логично поставить в конец кадой итерации цикла
while (!$done)
что- нибудь вроде
sleep(задержка)
Но даже при указании такой задержки в 1 микросекунду скрипт замедляется вдвое!
Если же указать норм. задержку в 1000 микросекунд, то вообще умирает.
Насколько я понял, дело в том, что когда процесс "спит", он почему- то перестает получать данные с сокетов.
Более того, я пробовал вместо
sleep()
вставлять какой- нибудь большой цикл типа
PHP:
for ($k = 0; $k < 100000; $k++)
md5($k);
время его выполнения примерно 0.2 сек
Результат тот же!!!
Может нужно сокет как- то еще настроить?
если кто- то знает в чем дело, помогите плиз!