понедельник, 22 августа 2011 г.

Изучаем чекер, создаем мульти чекер часть 1

Всем добрый день или ночь :) сегодня хочу рассказать как мне пришлось модифицировать и проапдейтить чекер для яндекс мани из одно поточного в мультипоточный с проксями.

Из данных постов вы можете узнать для себя как использовать мультипотоки в php, а точнее их аналог curl_multi, как интегрировать мулипоточность в однопоточный скрипт, как добавить подключение через прокси и собственно как создать сам чекер, на curl, так же по данной технологии всегадо можно создавать парсеты и анализаторы и множество других ползеных и нужных вещей :)

Ну чтож начнем 1 что нам понадобиться для создания мулти поточность это набор функций мулти курл и самая основная функция здесь curl_multi_init или русский вариант (но здесь без примеров) .

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



Так в общем первое что здесь нужно это изучить работу самой мулти курл, рассмотрим пример кода:


$mh = curl_multi_init();

for($s=0;$s$ch[$s] = curl_init();

curl_setopt($ch[$s], CURLOPT_URL, $url[$s]);

curl_setopt($ch[$s] , CURLOPT_HTTPHEADER, $headers);


curl_setopt($ch[$s], CURLOPT_HEADER, 1);
curl_setopt($ch[$s], CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch[$s], CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch[$s], CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch[$s], CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch[$s], CURLOPT_SSL_VERIFYHOST, false);


curl_multi_add_handle($mh,$ch[$s]);
}



Что мы сдесь видем?

В начале с помощью функции curl_multi_init создаеться стандартный набор мульти дискриптеров, енто эдыкая ссылка на мулти потом в общем не замарачивайтесь пока.

После создания мулти дескриптера создаем стандарнтые дискриптеры курл с пораметрами для них после чего в конце функцией curl_multi_add_handle добовям все в набор.



Что происходит дольше и как нам все это запистить иглавное получить результат?

Далее береться пример из официального мана и куриться до посинения! шучу :)

В общем пример из оф мана действительно желаетьно взять и понять как это работаеться

В целом не буду дальше загружать вас работой других функций, об это не мало написано в ру нете просто скажу как нам использывать другой кусок кода, чтож берем пример из мана :) да я серьезно отличный пример :)


while( ($mrc = curl_multi_exec($mh, $running))==CURLM_CALL_MULTI_PERFORM );
while($running && $mrc == CURLM_OK){
if($running and curl_multi_select($mh)!=-1 ){
do{
$mrc = curl_multi_exec($mh, $running);

if( $info=curl_multi_info_read($mh) and $info['msg'] == CURLMSG_DONE ){
$ch = $info['handle'];

$status=curl_getinfo($ch,CURLINFO_HTTP_CODE);

$data[]=curl_multi_getcontent($info['handle']);
curl_multi_remove_handle($mh, $ch);
curl_close($ch);
}
}while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
usleep(100);
}



Данный пример слегка модифецирован мною, но вам не стоит пока над этим замарачиваться бериде уже готовый, в общем в массиве $data оказываються все результатмы работы мулти, из можно легко вывсети на экран echo $data :)

Да если кто то из вас так и не понил куда пихать линки то сразу скажу что в массив $url

Да да $url это массив :)

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