Приветвую всех.
Имею виртуальный сервер VPS.
Nginx + php-fpm.
100мбит/сек.
_
Мне необходимо всегда иметь свежие прокси.
Поскольку прокси беру публичные - надо часто их проверять. Для этих целей был выбран Multi curl.
Написал на PHP класс и проверяю прокси вот так:
$cmh = curl_multi_init();
foreach($proxies as $k=>$v){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://'.$domain."/?".mt_rand(0,999));
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36");
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($ch, CURLOPT_PROXY, $v);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_multi_add_handle($cmh, $ch);
$tasks[$v] = $ch;
}
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 {
$mrc = curl_multi_exec($cmh, $active);
$info = curl_multi_info_read($cmh);
if ($info['msg'] == CURLMSG_DONE) {
$ch = $info['handle'];
$getinfo = curl_getinfo($ch);
$retcode = $getinfo['http_code'];
$proxy = array_search($ch, $tasks);
$phptime = microtime(1)-$startphptime;
$totaltime = $getinfo['total_time'];
// пока проверяю только код ответа, потом буду проверять сам ответ
if($retcode==200){
$this->good[] = array($proxy,$retcode,$phptime,$totaltime);
}else{
$this->bad[] = array($proxy,$retcode,$phptime,$totaltime);
}
}
usleep(100);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
usleep(100);
}
Когда ставлю на проверку 1-2 прокси - все работает хорошо. Ставлю более 10 - очень много либо нерабочих, либо тех, от которых очень долго не приходил ответ.
При том те самые прокси, что якобы "долгие" или нерабочие по мнению мультикурла - оказываются рабочими и очень быстрыми при проверке вручную или одни запросом курла(без мультикурла).
Ставил таймауты. при маленьком таймауте прокси вообще не собираются, и мультикурл просто завершает работу.
--
Думал что что-то не так написал.
Но решил проверить HTTP\S прокси.
Убрал curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
Запустил и О, чудо.
Все заработало и 200 прокси проверилось за 20 сек(время самого долгого запроса)
---
Снова проверял Сокс5 - результат по-прежнему ужасный.
Такое ощущение, что все таки сокс5 прокси как-то встают в очередь, и не происходит никакой многопоточности. А если ограничить таймаутом - вообще не выполнится ни один поток мультикурла.
Также проверял и на сервер и на денвере - результат
---
Может кто знает, почему такое происходит?
И подсказать, что я делаю не так.