Dimanjy
Новичок
Многопоточные сокеты медленнее Curl. Почему?
Был у меня старый примитивный модуль для поисковика, написанный под Curl. В него последовательно передавались адреса сайтов и он отдавал ответ. Решил я ускорить работу поисковика, переписав модуль с использованием многопоточных сокетов. В результате оказалось, что последовательный Curl против многопоточных сокетов на том же списке сайтов дает в 10 раз большую скорость. Испытания проводились на VPS под Fedora Core 2, PHP 4.3.11. На локальной машине под Win оба варианта по скорости примерно одинаковые, но опять же, с некоторым перевесом в сторону Curl.
Вопрос такой: почему многопоточные сокеты не дали ожидаемого эффекта? зависит ли их работа от особенностей организации VPS (Virtuozzo) и как с этим бороться?
Схема реализации на Curl:
Схема реализации на сокетах:
Помогите, пожалуйста, в поиске причины.
Заранее благодарю!
Был у меня старый примитивный модуль для поисковика, написанный под Curl. В него последовательно передавались адреса сайтов и он отдавал ответ. Решил я ускорить работу поисковика, переписав модуль с использованием многопоточных сокетов. В результате оказалось, что последовательный Curl против многопоточных сокетов на том же списке сайтов дает в 10 раз большую скорость. Испытания проводились на VPS под Fedora Core 2, PHP 4.3.11. На локальной машине под Win оба варианта по скорости примерно одинаковые, но опять же, с некоторым перевесом в сторону Curl.
Вопрос такой: почему многопоточные сокеты не дали ожидаемого эффекта? зависит ли их работа от особенностей организации VPS (Virtuozzo) и как с этим бороться?
Схема реализации на Curl:
PHP:
$hosts = array('site1','site2'); // Массив сайтов
foreach($hosts as $host){
curl_setopt($ch, CURLOPT_URL, $host);
$content = curl_exec($ch);
}
PHP:
$hosts = array('site1','site2'); // Массив сайтов
$sockets = array(); // Массив сокетов
foreach($hosts as $i=>$host){
$ip = gethostbyname($hosts[$i]);
$sockets[$i] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($sockets[$i]);
socket_connect($sockets[$i],$ip,80);
}
// Рабочий цикл
while(1){
// Массивы для socket_select
$arrRead = array(); $arrWrite = array();
foreach($sockets as $i=>$sh){
// Заполняем массивы чтения и записи в зависимости
// от текущего состояния сокета (отправляем GET или уже получаем данные)
// .....
}
$num = socket_select($arrRead, $arrWrite, $arrExcept = NULL, $tv_sec=1);
if($numc>0){
// Read sockets
if(count($arrRead)>0){
foreach($arrRead as $socket){
$str = socket_read($socket,1);
if($str==''){ // Все данные получены, закрываем сокет
socket_shutdown($socket);
socket_close($socket);
}
}
}
// Write sockets
if(count($arrWrite)>0){
foreach($arrWrite as $socket){
$str = ...; // Берем следующий символ из отправляемого заголовка
socket_write($socket,$str,1);
}
}
}
}
}
Заранее благодарю!