xarp
Новичок
Проблема с мультикурлом при работе через socks5
Добрый день.
Ваш форум почитываю уже давно, но зарегистрироваться решился только сегодня, после того, как 2 дня промучился над одним вопросом и нигде - ни в архиве форума, ни во всем интернете не нашел решения моей проблемы.
Сейчас пишу чекер socks5-проксей и для этого использую мультикурл. При использовании easy curl проблем не возникает. Разве что зависание скрипта, и отказ таймаутов, если прокси-сервер не отвечает, но как я понял - это известный баг и его обещали исправить в следующем релизе curl'а. Если же я начинаю использовать многопоточные функции, то скрипт выдает по каждому потоку следующее: "Curl error on handle 1: Send failure: Socket is not connected"
Код скрипта:
Система: ОС FreeBSD, PHP Version 5.1.6, libcurl 7.15.5
Стоит убрать 2 строки:
curl_setopt ($conn[$i], CURLOPT_PROXY, trim($url));
curl_setopt ($conn[$i], CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
и все работает. Если закомментировать только вторую строку и в proxies.txt положить http-прокси, тоже работает. Сами прокси рабочие. Уверен, так как проверил на однопоточном скрипте. Может кто сталкивался, в чем может быть проблема?
Заранее спасибо за помощь!
Добрый день.
Ваш форум почитываю уже давно, но зарегистрироваться решился только сегодня, после того, как 2 дня промучился над одним вопросом и нигде - ни в архиве форума, ни во всем интернете не нашел решения моей проблемы.
Сейчас пишу чекер socks5-проксей и для этого использую мультикурл. При использовании easy curl проблем не возникает. Разве что зависание скрипта, и отказ таймаутов, если прокси-сервер не отвечает, но как я понял - это известный баг и его обещали исправить в следующем релизе curl'а. Если же я начинаю использовать многопоточные функции, то скрипт выдает по каждому потоку следующее: "Curl error on handle 1: Send failure: Socket is not connected"
Код скрипта:
PHP:
$mh = curl_multi_init();
$base = file("proxies.txt");
foreach ($base as $i => $url) {
$conn[$i] = curl_init("http://moy_domen.com");
curl_setopt ($conn[$i], CURLOPT_TIMEOUT, 30);
curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($conn[$i], CURLOPT_PROXY, trim($url));
curl_setopt ($conn[$i], CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt ($conn[$i], CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle ($mh,$conn[$i]);
}
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active and $mrc == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
sleep(1);
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
if ($mrc != CURLM_OK) {
print "Curl multi read error $mrc\n";
}
foreach ($base as $i => $url) {
if (($err = curl_error($conn[$i])) == '') {
$res[$i]=curl_multi_getcontent($conn[$i]);
} else {
print "Curl error on handle $i: $err<br>";
}
curl_multi_remove_handle($mh,$conn[$i]);
curl_close($conn[$i]);
}
curl_multi_close($mh);
Стоит убрать 2 строки:
curl_setopt ($conn[$i], CURLOPT_PROXY, trim($url));
curl_setopt ($conn[$i], CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
и все работает. Если закомментировать только вторую строку и в proxies.txt положить http-прокси, тоже работает. Сами прокси рабочие. Уверен, так как проверил на однопоточном скрипте. Может кто сталкивался, в чем может быть проблема?
Заранее спасибо за помощь!