Массовая проверка Proxy !

Статус
В этой теме нельзя размещать новые ответы.

Inviseble_Demon

Мой дом здесь!
Регистрация
11 Дек 2008
Сообщения
478
Реакции
377
Доброго всем времени суток.
Вот наваял функцию тестирования прокси (Функция проверки прокси на роботоспособность, на доступность GET и отсутствие бана на yandex).

Вроде прикрасно работает но... НУЖЕН мульти курл. Иначе из-за тормазов проксей все тянеца ну очень долго а так в 20-50 потоков (хоть и псевдо) пустить будит думаю намного быстрее )).

Проблемма в том что с курлами дела у меня плохи а по статьям с мультиком так и не разобрался ((. Прошу помощи у Вас. В итоге если допишем данную функцию она многи понадобиться и поможет !

PHP:
<?PHP 
function test_proxy($proxy)  // Функция проверки прокси на роботоспособность, на доступность GET и отсутствие бана на yandex. 
    { 
        $rand=rand(2345678,23456789023456789087654); 
        $url = "http://yandex.ru/yandsearch?text=$rand"; 
        $ua = "Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)"; 
        $ch = curl_init(); 
         
        curl_setopt($ch, CURLOPT_USERAGENT, $ua); 
        curl_setopt($ch, CURLOPT_URL, $url); 
        curl_setopt($ch, CURLOPT_TIMEOUT, 5);  
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
        curl_setopt($ch, CURLOPT_PROXY, $proxy); 

        $result = curl_exec($ch); 
        if (preg_match("#$rand#", $result)){return true;} 
        else {return false;} 
     
    } 
?>
 
вот, довел до ума чекер многопоточный.
UPD в связи с моими постоянно пополняющимеся знаниями был совершен апгрейд.
во первых теперь мне стало ясно, что более 100 потоков на один URL сам judge не выдерживает, и отвечает с задержкой вплоть до 5 секунд при этом(в штатном режиме ответ от него за 150 милисекунд приходит)
во вторых, скрипт теперь не грузит проц на 100%, как предыдшая версия
суть замены
PHP:
	$running=null;
	do
		curl_multi_exec($mh,$running);
	while($running>0);
//поменял на 
	$active = null;
	do
		$mrc = curl_multi_exec($mh, $active);
	while ($mrc == CURLM_CALL_MULTI_PERFORM);
	while ($active && $mrc == CURLM_OK)
	if (($qwe=curl_multi_select($mh,1)) != -1)
		do
			$mrc = curl_multi_exec($mh, $active);
		while ($mrc == CURLM_CALL_MULTI_PERFORM);
собственно чекер:
PHP:
<?
define("_THREAD",	100);//больше 100 потоков этот URL не выдерживает эффективно
define("_TRY",		1);//по поводу нескольких попыток, что-то я заглючил с multiCURL-ом, поэтому не трогаем
define("_URL",		"http://zerg.helllabs.net/cgi-bin/textenv.pl");
define("_TIME",		40);//+ 5-10 секунд по сравнению с тем, что нам надо

//--------------------------------------------------------------------------------
error_reporting(E_ALL);
set_time_limit(0);
ignore_user_abort(TRUE);
ob_implicit_flush();
//--------------------------------------------------------------------------------
//$fpi=fopen('2check.txt','r');
$fpi=fopen('_2check(x20).txt','r');//файл для чека
//$fpo=fopen('checked.txt','w');
$fpo=fopen('checked.txt','a');//сюда складываются все прокси
$fpc=fopen('CoDeeN.txt','a');//а сюда все CoDeeN-прокси

$count=0;
$i=0;
$mh=curl_multi_init();
$ch=array();
$proxy=array();
while(!feof($fpi))
	{
	$proxy[$i]=trim(fgets($fpi, 4096));
	$ch[$i]=curl_init();
	//curl_setopt($ch[$i],CURLOPT_URL,"http://ya.ru");	
	curl_setopt($ch[$i],CURLOPT_URL,_URL);	
	curl_setopt($ch[$i],CURLOPT_RETURNTRANSFER,1);
	curl_setopt($ch[$i],CURLOPT_CONNECTTIMEOUT,_TIME);
	curl_setopt($ch[$i],CURLOPT_TIMEOUT,_TIME);
	curl_setopt($ch[$i],CURLOPT_PROXY,$proxy[$i]);
	curl_multi_add_handle($mh,$ch[$i]);
	$i++;
	if($i==_THREAD)
		{
		for($j=0;$j<_TRY;$j++)
			check($mh,$ch,$proxy);
		for($j=0;$j<_THREAD;$j++)
			curl_multi_remove_handle($mh,$ch[$j]);
		curl_multi_close($mh);
		$i=0;
		$mh=curl_multi_init();
		$ch=array();
		$proxy=array();
		echo (++$count)."\n";
		}
		
	}

function check(&$mh,&$ch,&$proxy)
	{
	global $fpo,$fpc;
	curl_multi_exec($mh,$running);

	$active = null;
	do
		$mrc = curl_multi_exec($mh, $active);
	while ($mrc == CURLM_CALL_MULTI_PERFORM);
	while ($active && $mrc == CURLM_OK)
	if (($qwe=curl_multi_select($mh,1)) != -1)
		do
			$mrc = curl_multi_exec($mh, $active);
		while ($mrc == CURLM_CALL_MULTI_PERFORM);
	/*такая конструкция почему-то грузит проц в отличии от предыдущей
	do
		{
		curl_multi_exec($mh,$running);
		}
	while($running>0);
	*/
	
	
	for($j=0;$j<_THREAD;$j++)
		{
		$data=curl_multi_getcontent($ch[$j]);
		$temp=curl_getinfo($ch[$j]);
		if($data!='')//довольно сомнительная проверка, но она выделяет  всех тех, что хотя бы ответил
			{
			if(strpos($data,"CoDeeN")!==FALSE)//CoDeen
				{
				fwrite($fpc,$proxy[$j]."\r\n");
				}
			else
				{
				fwrite($fpo,$proxy[$j]."\r\n");
				}
			}
		}
	}


fclose($fpi);
fclose($fpo);
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху