|
| Дата |
|
USD/RUB | 93.7196 | BTC/USD | 63618.2782 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
05.05.2010, 01:17
|
#1
|
коплю на феррари
Регистрация: 03.07.2008
Сообщений: 1,251
Бабло: $148195
|
чекер 200 OK
периодически встречаю тему про чекеры, тут кинулся сам, а найти не могу. быстренько наваял. Запускать в скрине (screen) php parser.php > /dev/null.
Может, кому пригодится. Требования:
1. прямые руки
2. screen
3. php
4. php-curl
5. linux-like system( need fork)
В папку с чекером кладем список site.txt с урлами, разделенными переводами строки. Файл z_200ok.txt - результат работы скрипта
PHP код:
<?php ##########тут кол-во потоков указываем########### $count =300; ######################################### define( 'ABSPATH', dirname(__FILE__) . '/' ); define('MAXPROCESS',$count); //fetch(); //echo parser($url); $good=fopen(ABSPATH.'z_good.txt',"a"); $good200ok=fopen(ABSPATH.'z_200ok.txt',"a"); $bad=fopen(ABSPATH.'z_bad.txt',"a"); $handle=fopen(ABSPATH.'site.txt',"r"); $execute=0; while(!feof($handle)){ $url=trim(fgets($handle)); //var_dump(parser($url)); $data=array(); ###################форкаемся####################### $pid=pcntl_fork(); //exit(); if($pid==-1){ }elseif ($pid){ $execute++; if ($execute>=MAXPROCESS){ pcntl_wait($status); $execute--; } }else{ ###################джобим####################### $data=parser($url); if(!$data){ fwrite($bad,$url."\n"); exit(); }else{ fwrite($good,$data['url'].';'.$data['http_code']."\n"); if($data['http_code']=='200'){ fwrite($good200ok,$data['url']."\n"); } } ##################конец джоба################# exit(); } } $i_wait=true; while ($i_wait){ $waii=pcntl_wait($status); if($waii==-1) $i_wait=false; } function parser($url){ $return_data=array(); $return_data=fetch($url); return $return_data; }
function fetch($url,$timeout=20,$proxy='',$curlopt_header=false){ if(!gethostbyname($url)){ return false; } $return_data=array(); $headers[]='User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729)'; $headers[]= 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; $headers[]= 'Accept-Language: en-us;q=0.7,en;q=0.3'; $headers[]= 'Accept-Encoding: gzip,deflate'; $headers[]= 'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7'; $headers[]= 'Keep-Alive: 300'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if($proxy!=''){ curl_setopt($ch, CURLOPT_PROXY, $proxy); } curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HEADER, $curlopt_header); curl_setopt($ch, CURLOPT_REFERER,''); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); if(curl_exec($ch)!=false){ $return_data['reply'] =true; }else{ return false; //$return_data['reply'] =false; } //$return_data['reply'] = curl_exec($ch); $info = (curl_getinfo($ch)); curl_close($ch); //print_r($info); $return_data['url']=$info['url']; $return_data['http_code']=$info['http_code']; return $return_data; } ?>
Последний раз редактировалось sergeospb; 05.05.2010 в 05:44.
|
|
|
05.05.2010, 01:37
|
#2
|
Senior Member
Регистрация: 05.08.2009
Сообщений: 423
Бабло: $94751
|
ну и код, не понятно ниче
зачем
if(curl_exec($ch)!=false){
$return_data['reply'] =true;
}
когда можно
if (curl_exec($ch))
$return_data['reply'] =true;
?
|
|
|
05.05.2010, 01:39
|
#3
|
коплю на феррари
Регистрация: 03.07.2008
Сообщений: 1,251
Бабло: $148195
ТС -->
|
ТС
Цитата:
Сообщение от ne0zx
ну и код, не понятно ниче
зачем
if(curl_exec($ch)!=false){
$return_data['reply'] =true;
}
когда можно
if (curl_exec($ch))
$return_data['reply'] =true;
?
|
привычка, в данном случае можно. а так код вроде бы понятен, прям с мануала по пыху код выдран. х.з, чо тут нипанятнага
|
|
|
05.05.2010, 01:48
|
#4
|
Senior Member
Регистрация: 05.08.2009
Сообщений: 423
Бабло: $94751
|
непонятно будет, если начать искать баги в таких конструкциях:
if($pid==-1){
}elseif ($pid){
$execute++;
if ($execute>=MAXPROCESS){
pcntl_wait($status);
$execute--;
}
}else{
$data=parser($url);
if(!$data){
fwrite($bad,$url."\n");
exit();
}else{
если написал, работает и забыл, тогда другое дело
|
|
|
05.05.2010, 01:58
|
#5
|
коплю на феррари
Регистрация: 03.07.2008
Сообщений: 1,251
Бабло: $148195
ТС -->
|
ТС
Цитата:
Сообщение от ne0zx
непонятно будет, если начать искать баги в таких конструкциях:
if($pid==-1){
}elseif ($pid){
$execute++;
if ($execute>=MAXPROCESS){
pcntl_wait($status);
$execute--;
}
}else{
$data=parser($url);
if(!$data){
fwrite($bad,$url."\n");
exit();
}else{
если написал, работает и забыл, тогда другое дело
|
поправил, этот код как раз взят из мануала.
|
|
|
05.05.2010, 02:29
|
#6
|
Member
Регистрация: 12.11.2009
Сообщений: 73
Бабло: $14250
|
Демка хрумера умеет. Многопоточно. Без всякого php
|
|
|
05.05.2010, 03:21
|
#7
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
прежде чем обсуждать код, надо начать с того, что само решение не рационально в плане использование ресурсов, а именно памяти или времени.
$count =300; - на сервере сколько оперативы под это?
имхо лучше на мультикурле, а то если много ссылок будет, то либо с памятью проблемы вылезут, либо не быстро получится
а в целом, для непромышленных масштабов сойдет и это решение
|
|
|
05.05.2010, 05:23
|
#8
|
коплю на феррари
Регистрация: 03.07.2008
Сообщений: 1,251
Бабло: $148195
ТС -->
|
ТС
Цитата:
Сообщение от chesser
прежде чем обсуждать код, надо начать с того, что само решение не рационально в плане использование ресурсов, а именно памяти или времени.
$count =300; - на сервере сколько оперативы под это?
имхо лучше на мультикурле, а то если много ссылок будет, то либо с памятью проблемы вылезут, либо не быстро получится
а в целом, для непромышленных масштабов сойдет и это решение
|
пиздеть не мешки ворочать
1. вот ты лично пробовал на мультикурле, а? ситуация - пачка 100 урлов, отправляешь мультикурлу ее, так он тебе отдаст данные только после того, как отдаст данные самый тормознутый урл!
2. подобные код ( организация многопоточности) работает у меня уже как пару лет, я думаю
3. оперативы 4 гига
4. мультикурл как раз для НЕпромышленного варианта. Вариант, предложенный мной чекает примерно 4 ляма линков в сутки на канале якобы анлим сотня
Цитата:
Сообщение от roots
Демка хрумера умеет. Многопоточно. Без всякого php
|
дык у меня не только демка. умеет - но не совсем так, как хотелось бы, особенно что сервер под вендой как раз срумером то и занят
|
|
|
05.05.2010, 06:51
|
#9
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Цитата:
Сообщение от sergeospb
пиздеть не мешки ворочать
1. вот ты лично пробовал на мультикурле, а? ситуация - пачка 100 урлов, отправляешь мультикурлу ее, так он тебе отдаст данные только после того, как отдаст данные самый тормознутый урл!
|
да: парсеры-граберы, чекалки и тд.
Почему у тебя курл отдает данные по тормознутому урлу - я не знаю наверно алгоритм кривой
Цитата:
Сообщение от sergeospb
2. подобные код ( организация многопоточности) работает у меня уже как пару лет, я думаю
|
да, она работает, только ресурсов жрет лишка
Цитата:
Сообщение от sergeospb
3. оперативы 4 гига
|
Цитата:
Сообщение от sergeospb
4. мультикурл как раз для НЕпромышленного варианта. Вариант, предложенный мной чекает примерно 4 ляма линков в сутки на канале якобы анлим сотня
|
к примеру у меня есть чекер проксей на мультикурле, проверяет 1000 проксей в минуту на VPS 256М RAM
если считать как ты в сутки, то получается 1000*60*24=1 440 000 / сут
теперь если привести к твоим 4 гигам, то будет 23 040 000 в сутки
ну и прокси чекать - это не урлы чекать на 200ок, а посложнее будет, плюс чекер можно еще поотимизировать
форк - это почти создание копии php процесса, только он создается как подпроцесс основного. Т.е. это лишние затраты на память и тд.
Мультикурл же создает свои мультипотоки средствами сишной библиотеки внутри одной копии php скрипта, тем самым памяти кушается в разы меньше(при большом кол-ве потоков), если все эти потоки форкать - поправьте, если не прав
форк - мультипроцессность
мультикурл - мультипоточность
мультипоточность выгоднее на больших объемах тем, что все потоки пользуются одними и теми же ресурсами сразу, т.е. более рациональный расход памяти и процессора. Зато процессность наверно лучше по безопасности, независимости и тд...свои плюсы есть, но не в чекалках
поэтому мультикурл круче
|
|
|
05.05.2010, 18:10
|
#10
|
коплю на феррари
Регистрация: 03.07.2008
Сообщений: 1,251
Бабло: $148195
ТС -->
|
ТС
Цитата:
Сообщение от chesser
да: парсеры-граберы, чекалки и тд.
поэтому мультикурл круче
|
1.еще раз говорю - пиздеть не мешки ворочать, выложи код - заценим
2.вечный холивар с этими форками, нитями (threads) и т.д.
Предложи еще на сях писать - так типа нативнее для линупса и в разы быстрее работать будет да и круче. Цель выкладывания скрипта - была не отнюдь начинание холивара на известную тему. Есть идеи? напиши - выложи, заценим.
|
|
|
|