[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: curl_multi_exec и кол-во активных процессов
lsd
Добрый день.
Никогда не задавал вопросов на форумах, но в этот раз ничего не нашел поиском. Итак, суть проблемы...

Есть скрипт, демонстрирующий работу php+curl, к примеру вот здесь: tsamada.com.ua/web/mnogopotochnost-v-php-curl/

Он работает как и требуется, все в порядке. Модифицируем его в скрипт, который будет отправлять изображения на сервис antigate.com:
<?php
$imgs = glob("/temp/imgs/*.jpg"); // массив с картинками, их около 10
$cmh = curl_multi_init();
$api = "*****************************"; // ключ на антигейт
$tasks = array();
foreach ($imgs as $img) {
$postdata = array('method' => 'post', 'key' => $api, 'file' => '@'.$img, 'phrase' => 0, 'regsense' => 0, 'numeric' => 0, 'min_len' => 0, 'max_len' =>0);
$ch = curl_init('http://www.antigate.com/in.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
$tasks[$img] = $ch;
curl_multi_add_handle($cmh, $ch);
}
$active = null;
do {
$mrc = curl_multi_exec($cmh, $active);
}
while ($mrc == CURLM_CALL_MULTI_PERFORM);
// выполняем, пока есть активные потоки
while ($active && ($mrc == CURLM_OK)) {
// если какой-либо поток готов к действиям
if (curl_multi_select($cmh) != -1) {
// ждем, пока что-нибудь изменится
do {
### Вот здесь непоняточка... ###
echo $active." - ";
$mrc = curl_multi_exec($cmh, $active);
echo $active."<br>\n";
################################
$info = curl_multi_info_read($cmh);
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
$img = array_search($ch, $tasks);
$tasks[$img] = curl_multi_getcontent($ch);
curl_multi_remove_handle($cmh, $ch);
curl_close($ch);
}
}

while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}

curl_multi_close($cmh);
?>

Проблема в том, что в выделенном месте функция curl_multi_exec должна уменьшать значение переменной $active на единицу, т.к. в той части кода обрабатывается один готовый поток, и в результате постепенно идет перебор всех завершившихся потоков, НО! В случае с приведенным кодом возникают пропуски в получаемых потоках, т.е. к примеру, перед вызовов функции curl_multi_exec в указанном месте $active = 8, а после вызова может стать 5, хотя по всей логике вещей должна стать 7! Из-за этого в начальном массиве картинок может быть 10, а получено будет к примеру только 7 результатов. Кому будет не в лом - накидайте в папку с десяток картиночек и запустите скрипт.

Происходит это как-то рандомно - то все в порядке, то снова начинают вылазить подобные косячки.

Бьюсь третий день - ума не приложу, почему так происходит. Опыта в кодинге не занимать - но с таким сталкиваюсь впервые.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.