Задать вопрос

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


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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽