curl_multi_select последовательно терпит неудачу по неизвестной причине

Я создал PHP-скрипт для запуска некоторых запросов Google, чтобы познакомиться с концепцией множественных параллельных запросов в curl. В качестве основы я использовал пример № 1 на этой странице: http://php.net/manual/en/function.curl-multi-exec.php

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

Код

$queries = array("Mr.", "must", "my", "name", "never", "new", "next", "no", "not", "now");

$mh = curl_multi_init();
$handles = array();
foreach($queries as $q)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.nl/#q=" . $q);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh,$ch);
$handles[] = $ch;
}

echo "created\n";

$active = null;
$mrc = curl_multi_exec($mh, $active);
if ($mrc != CURLM_OK)
throw new Exception("curl_multi_exec failed");

while ($active && $mrc == CURLM_OK) {
$select = curl_multi_select($mh);
if ($select != -1) {
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
} else throw new Exception("curl_multi_select failed (it returned -1)");
}

// removed cleanup code for briefety.

Вопрос

Как я могу узнать, почему curl_multi_select возвращает -1 или почему он возвращает -1? Нужна ли мне какая-то специальная конфигурация php для обеспечения многопоточности?

1

Решение

Как говорится в комментарии http://php.net/manual/en/function.curl-multi-init.php#115055, есть проблема в официальном документе.

Я не знаю почему и у меня недостаточно знаний по libcurl, но я понимаю, что curl_multi_select($mh) всегда есть шанс вернуть -1;

Итак, этот фрагмент (из приведенного выше URL) работает для меня.

<?php
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) == -1) {
usleep(100);
}
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
?>
2

Другие решения

Других решений пока нет …