Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB58.8280
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 05.05.2010, 01:17   #1
sergeospb
коплю на феррари
 
Регистрация: 03.07.2008
Сообщений: 1,262
Бабло: $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($chCURLOPT_URL$url);
    if(
$proxy!=''){
        
curl_setopt($chCURLOPT_PROXY$proxy);
    }
    
curl_setopt($chCURLOPT_HTTPHEADER$headers);
    
curl_setopt($chCURLOPT_HEADER$curlopt_header);
    
curl_setopt($chCURLOPT_REFERER,'');
    
curl_setopt($chCURLOPT_FOLLOWLOCATION2);
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
    
curl_setopt($chCURLOPT_ENCODING'gzip,deflate');
    
curl_setopt($chCURLOPT_SSL_VERIFYPEER0);
    
curl_setopt($chCURLOPT_CONNECTTIMEOUT$timeout);
    
curl_setopt($chCURLOPT_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.
sergeospb вне форума  
Старый 05.05.2010, 01:37   #2
ne0zx
Senior Member
 
Аватар для ne0zx
 
Регистрация: 05.08.2009
Сообщений: 423
Бабло: $92961
По умолчанию

ну и код, не понятно ниче
зачем

if(curl_exec($ch)!=false){
$return_data['reply'] =true;
}

когда можно
if (curl_exec($ch))
$return_data['reply'] =true;

?
ne0zx вне форума  
Старый 05.05.2010, 01:39   #3
sergeospb
коплю на феррари
 
Регистрация: 03.07.2008
Сообщений: 1,262
Бабло: $148195
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от ne0zx Посмотреть сообщение
ну и код, не понятно ниче
зачем

if(curl_exec($ch)!=false){
$return_data['reply'] =true;
}

когда можно
if (curl_exec($ch))
$return_data['reply'] =true;

?
привычка, в данном случае можно. а так код вроде бы понятен, прям с мануала по пыху код выдран. х.з, чо тут нипанятнага
sergeospb вне форума  
Старый 05.05.2010, 01:48   #4
ne0zx
Senior Member
 
Аватар для ne0zx
 
Регистрация: 05.08.2009
Сообщений: 423
Бабло: $92961
По умолчанию

непонятно будет, если начать искать баги в таких конструкциях:

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{

если написал, работает и забыл, тогда другое дело
ne0zx вне форума  
Старый 05.05.2010, 01:58   #5
sergeospb
коплю на феррари
 
Регистрация: 03.07.2008
Сообщений: 1,262
Бабло: $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{

если написал, работает и забыл, тогда другое дело
поправил, этот код как раз взят из мануала.
sergeospb вне форума  
Старый 05.05.2010, 02:29   #6
roots
Member
 
Аватар для roots
 
Регистрация: 12.11.2009
Сообщений: 73
Бабло: $14250
Отправить сообщение для roots с помощью ICQ
По умолчанию

Демка хрумера умеет. Многопоточно. Без всякого php
roots вне форума  
Старый 05.05.2010, 03:21   #7
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $470735
По умолчанию

прежде чем обсуждать код, надо начать с того, что само решение не рационально в плане использование ресурсов, а именно памяти или времени.

$count =300; - на сервере сколько оперативы под это?

имхо лучше на мультикурле, а то если много ссылок будет, то либо с памятью проблемы вылезут, либо не быстро получится

а в целом, для непромышленных масштабов сойдет и это решение
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 05.05.2010, 05:23   #8
sergeospb
коплю на феррари
 
Регистрация: 03.07.2008
Сообщений: 1,262
Бабло: $148195
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от chesser Посмотреть сообщение
прежде чем обсуждать код, надо начать с того, что само решение не рационально в плане использование ресурсов, а именно памяти или времени.

$count =300; - на сервере сколько оперативы под это?

имхо лучше на мультикурле, а то если много ссылок будет, то либо с памятью проблемы вылезут, либо не быстро получится

а в целом, для непромышленных масштабов сойдет и это решение
пиздеть не мешки ворочать
1. вот ты лично пробовал на мультикурле, а? ситуация - пачка 100 урлов, отправляешь мультикурлу ее, так он тебе отдаст данные только после того, как отдаст данные самый тормознутый урл!
2. подобные код ( организация многопоточности) работает у меня уже как пару лет, я думаю
3. оперативы 4 гига
4. мультикурл как раз для НЕпромышленного варианта. Вариант, предложенный мной чекает примерно 4 ляма линков в сутки на канале якобы анлим сотня
Цитата:
Сообщение от roots Посмотреть сообщение
Демка хрумера умеет. Многопоточно. Без всякого php
дык у меня не только демка. умеет - но не совсем так, как хотелось бы, особенно что сервер под вендой как раз срумером то и занят
sergeospb вне форума  
Старый 05.05.2010, 06:51   #9
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,382
Бабло: $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 скрипта, тем самым памяти кушается в разы меньше(при большом кол-ве потоков), если все эти потоки форкать - поправьте, если не прав

форк - мультипроцессность
мультикурл - мультипоточность

мультипоточность выгоднее на больших объемах тем, что все потоки пользуются одними и теми же ресурсами сразу, т.е. более рациональный расход памяти и процессора. Зато процессность наверно лучше по безопасности, независимости и тд...свои плюсы есть, но не в чекалках

поэтому мультикурл круче
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 05.05.2010, 18:10   #10
sergeospb
коплю на феррари
 
Регистрация: 03.07.2008
Сообщений: 1,262
Бабло: $148195
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от chesser Посмотреть сообщение
да: парсеры-граберы, чекалки и тд.

поэтому мультикурл круче
1.еще раз говорю - пиздеть не мешки ворочать, выложи код - заценим
2.вечный холивар с этими форками, нитями (threads) и т.д.
Предложи еще на сях писать - так типа нативнее для линупса и в разы быстрее работать будет да и круче. Цель выкладывания скрипта - была не отнюдь начинание холивара на известную тему. Есть идеи? напиши - выложи, заценим.
sergeospb вне форума  
Закрытая тема



Опции темы
Опции просмотра