KillDead
Хранитель порядка
- Регистрация
- 11 Авг 2006
- Сообщения
- 894
- Реакции
- 579
- Автор темы
- #1
В общем возникла проблема- есть у меня либа multicurl с неблокирующими соединениями (те готовые соединения удаляются, на их новые приходят новые
Но этот код убивает сервер если пхп меньше 5.2 - функция curl_multi_info_read не работает. И мне надо сделать аналогичный код без использования этой бажной функции. Пока решений не вижу. Сделал первое что взбрело в голову-
те просто в ходе работы запрашиваем информацию о всех потоках, если код ответа не 0, то удаляем поток- он готов. НО! если урл ещё обрабатывается я получаю такой ответ от curl_getinfo
а если сервер недоступен, я получаю аналогичный массив
Те получается блокировка- пока не пройдёт пачка положенных в мультикурл соединений- я не могу точно сказать какой поток "обрабатывается" а какой "сервер недоступен".
Как быть? Кто может посвятить на этот вопрос?
PHP:
while (true) {
// Создание потоков
.. code
// если их меньше чем Количество потоков- открываем и добавляем в $this->_curlMultiHandle новые
curl_multi_select($this->_curlMultiHandle);
while (($mcRes = curl_multi_exec($this->_curlMultiHandle, $mcActive)) == CURLM_CALL_MULTI_PERFORM) {
usleep($this->_usleepTime);
}
while ($threadInfo = curl_multi_info_read($this->_curlMultiHandle)) {
// Поток $threadInfo['handle'] успешо отработал ;
// закрывает его и удаляем из $this->_curlMultiHandle
..code
}
}
Но этот код убивает сервер если пхп меньше 5.2 - функция curl_multi_info_read не работает. И мне надо сделать аналогичный код без использования этой бажной функции. Пока решений не вижу. Сделал первое что взбрело в голову-
PHP:
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
$conn[$i] = curl_init($url);
curl_setopt($conn[$i], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($conn[$i], CURLOPT_TIMEOUT, 3);
curl_multi_add_handle($mh, $conn[$i]);
}
do {
$ready = curl_multi_select($mh);
$status = curl_multi_exec($mh, $active);
$info = curl_multi_info_read($mh);
foreach ($urls as $i => $url) {
$h = curl_getinfo($conn[$i]);
if (!$h['http_code']) {
continue;
}
echo "САЙТ загрузился - {$h['url']} \n";
}
usleep(1000);
} while ($status === CURLM_CALL_MULTI_PERFORM || $active);
HTML:
Array
(
[url] => http://www.bbc.co.uk/
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0
[redirect_time] => 0
)
HTML:
Array
(
[url] => http://www.cnnqqqqqqqqqqq.com/
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0
[redirect_time] => 0
)
Как быть? Кто может посвятить на этот вопрос?