Похожая ситуация. Отличия следующие:
а) у меня используется curl_multi...
б) соединение идет через SOCKS5 прокси
Результат: если с проксей все ок, худо-будно нормально работает. Если сокс лежит, функция curl_multi_exec($curl_master, $running) зависает на второй итерации цикла. И висит продолжительное время (в зависимости от количества потоков: 3-4 - 50-60 секунд, 4-7 - 80-120), после чего цикл продолжается, все curl-хендлеры отрабатываются, но курл заявляет об ошибке таймаута (он поставлен 20 секунд).
Кто подскажет, как заставить курл прерывать работу по таймауту? Я так понимаю это глюк его, кто сталкивался?
Вот опции:
CURLOPT_URL => $dest_host.'/test.php',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HEADER => false,
CURLOPT_LOW_SPEED_LIMIT => 2048,
CURLOPT_LOW_SPEED_TIME => 10,
CURLOPT_TIMEOUT => 20,
CURLOPT_CONNECTTIMEOUT => 20,
CURLOPT_USERAGENT => 'agent',
CURLOPT_POST => 1,
CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5,
CURLOPT_PROXY => $proxy_list[$i],
CURLOPT_PROXYUSERPWD => "user

assword",
CURLOPT_POSTFIELDS => 'command=Test'
если вдруг кому интересно - код:
$started = time();
// checking proxies:
$proxy_list = explode("\n", str_replace("\r", '', $proxylist));
$proxy_count = count($proxy_list);
$curl_common_opt = array(CURLOPT_URL => $dest_host.'/test.php',
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HEADER => false,
CURLOPT_LOW_SPEED_LIMIT => 2048,
CURLOPT_LOW_SPEED_TIME => 10,
CURLOPT_TIMEOUT => 90,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_USERAGENT => 'Transferer sender',
CURLOPT_POST => 1,
CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5);
$curl_master = curl_multi_init();
$curl_handlers = array();
for ($i = 0; $i < $proxy_count; $i++)
// preparing multi curl task:
{
$curl_handlers[$i] = curl_init();
curl_setopt_array($curl_handlers[$i], $curl_common_opt + array(CURLOPT_PROXY => $proxy_list[$i], CURLOPT_PROXYUSERPWD => "user

assword", CURLOPT_POSTFIELDS => 'command=Test'));
curl_multi_add_handle($curl_master, $curl_handlers[$i]);
}
$going = $proxy_count;
do
// implementing multi curl task:
{
if (@file_exists(DIR_CONTROLERS."/transf_send_stop.cntrl")) die('Manual stop');
curl_multi_exec($curl_master, $running);
if ($running < $going)
{
echo ($going-$running)." proxy test completed. now testing ".$running." proxies<br>\n";
$going = $running;
}
sleep(2);
echo "ch prx ($running); time: ".time()."<br>\n";
}
while ($running > 0);
for($i = 0; $i < $proxy_count; $i++)
// capturing multi task results:
{
$result = curl_multi_getcontent($curl_handlers[$i]);
if (curl_errno($curl_handlers[$i]) || $result != 'Test OK')
// if page was not got (proxy down):
{
if ($show_report) echo "Proxy ".$proxy_list[$i]." is down<br>\n";
echo curl_error($curl_handlers[$i])."<br>\n";
echo $result."<br>\n---------------------<br>\n";
unset($proxy_list[$i]);
}
curl_multi_remove_handle($curl_master, $curl_handlers[$i]);
curl_close($curl_handlers[$i]);
}
$proxy_list = array_merge($proxy_list, array());
echo "test took ".(time()-$started)." sec.<br>\n";
if (!count($proxy_list)) die("All proxies are down<br>\n");
die('test completed');
За стиль извиняюсь - не нашел, как на этом форуме код форматировать.