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


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

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

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
от 300 000 до 500 000 ₽
06 мая 2024, в 10:17
15000 руб./за проект
06 мая 2024, в 10:02
3000 руб./за проект