Сразу скажу, что это не помогло: http://php.ru/forum/viewtopic.php?t=10165&highlight=curl+%F2%E0%E9%EC%E0%F3%F2 Второй день бьюсь, никак победить не могу... помогите, кто чем может Значит, общая задача: сделать прокси-чекер. Споткнулся почти сразу же. Вот что удалось наваять: (php5): PHP: $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 => 30, //CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_USERAGENT => 'Some agent', 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:password", 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."/stop")) 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 "prx_cnt: ($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'); p.s. $dest_host в данном случае тот же, на котором размещен скрипт. Скрипт очень хорошо работает, если все прокси рабочие Проверка занимает около 20 секунд. Трабл в следующем, как только один падает - время выполнения затягивается на 60-100 секунд. Причем зависание происходит на второй итерации цикла "implementing multi curl task", в строке "curl_multi_exec($curl_master, $running);". Как я понимаю, он наталкивается на нерабочий прокси, долбится к нему битых полторы минуты, и потом продолжает цикл. И тут - ох ты! оказывается тайм-аут то наступил еще Бог весть когда... так что (ха-ха) курл со спокойной совестью сообщает мне об этом занимательном факте. Мол, я тут полчаса пытался отправить запрос, но таймаут-то 30 секунд, так что - извини - ошибочка! Внимание - вопрос! Как заставить его прекращать попытки соединения сразу же после наступления таймаута?