Плохо работает проверка Socks5-прокси через multi curl. А HTTP-прокси — идеально. Почему такое происходит?

Приветвую всех.
Имею виртуальный сервер 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 прокси как-то встают в очередь, и не происходит никакой многопоточности. А если ограничить таймаутом - вообще не выполнится ни один поток мультикурла.
Также проверял и на сервер и на денвере - результат
---
Может кто знает, почему такое происходит?
И подсказать, что я делаю не так.
  • Вопрос задан
  • 2286 просмотров
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
При том те самые прокси, что якобы "долгие" или нерабочие по мнению мультикурла - оказываются рабочими и очень быстрыми при проверке вручную или одни запросом курла(без мультикурла)


это про SOCKS прокси?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы