Просмотр полной версии : Многопоточность Socket/cURL оно нам надо?
Engineer
14.11.2009, 21:54
Доброго всем времени суток. На днях столкнулся с такой задачей - писал накрутчик, через несколько дней работы скрипта показалось что из него можно выжать больше переходов, от знакомых узнал что есть такая отличная фишка на курле - многопоточность, после нескольких тестов понял что скорость мне не удается увеличить... Сам я только начинаю разбираться во в языке php поэто я хотел бы посоветоваться с профессионалами.
Engineer
14.11.2009, 21:57
Собственно вот простенький пример
<?
include 'krut.php';
include 'config.php';
include 'r.php';
if (!$mass_proxy) { echo "Net Proxy";} else { echo"Proxy v poryade<br>";}
if (!$mass_browser) { echo "Net Browsers";} else { echo"Browsers v poryade<br>";}
/////////////////////////////////////////////////////////////////////////////////////////////////////
$pause = floor(3500 / $my_hosts);
$rand_br_max = count($mass_browser);
$rand_pr_max = count($mass_proxy);
$ctr = rand(65,130);
for ($i=0; $i < $my_hosts ; $i++) {
if ($i % $ctr == 0) { $zhertva = $linck; } else { $zhertva = $kartinka; }
$proxy = explode(":",$mass_proxy[rand(0,$rand_pr_max)]); //разделяем ип от порта
$s = stream_socket_client("test2.ru:80", $errno, $errstr, $timeout, STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT) ;
if ($s){
$send = "GET ".$zhertva." HTTP/1.1\r\n";
$send .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
$send .= "Referer: ".$my_referer."\r\n";
$send .= "Accept-Language: ru\r\n";
$send .= "Accept-Encoding: gzip, deflate\r\n";
$send .= "User-Agent: ".$mass_browser[rand($rand_br_min,$rand_br_max)]."\r\n";
$send .= "Host: ".$host_zhertva."\r\n";
$send .= "Connection: Keep-Alive\r\n";
$send .= "\r\n";
fputs($s,$send);
echo date("G:i:s").'<br>';
}
sleep($pause);
}
?>
Engineer
14.11.2009, 22:05
Мнение к которому я пришел возможно ошибочно но я решил что при использовании таких функциё как stream_socket_client и stream_select всего лишь разбивает наш поток на две части т.е - 1 запрос 2 ответ. Но как вы видите вторую функцию я не стал использовать т.к ответ меня не интересует(ведь скрипт всего лишь генерит запросы)
PS не нужно строго судить я всего лишь хочу в этом разобраться, а многопоточность я так и не смог внедрить.... Помогите разобраться
Engineer
14.11.2009, 22:09
Если кому то интересно вот скрипт с многопоточностью. Оригинальная тема на ibm.com (http://www.ibm.com/developerworks/ru/library/os-php-multitask/index.html)
<?php
echo "Program starts at ". date('h:i:s') . ".\n";
$timeout=10;
$result=array();
$sockets=array();
$convenient_read_block=8192;
/* Выполнить одновременно все запросы; ничего не блокируется. */
$delay=15;
$id=0;
while ($delay > 0) {
$s=stream_socket_client("phaseit.net:80", $errno,
$errstr, $timeout,
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT) ;
if ($s) {
$sockets[$id++]=$s;
$http_message="GET /demonstration/delay?delay=" .
$delay . " HTTP/1.0\r\nHost: phaseit.net\r\n\r\n";
fwrite($s, $http_message);
} else {
echo "Stream " . $id . " failed to open correctly.";
}
$delay -= 3;
}
while (count($sockets)) {
$read=$sockets;
stream_select($read, $w=null, $e=null, $timeout);
if (count($read)) {
/* stream_select обычно перемешивает $read, поэтому мы должны вычислить,
из какого сокета выполняется чтение. */
foreach ($read as $r) {
$id=array_search($r, $sockets);
$data=fread($r, $convenient_read_block);
/* Сокет можно прочитать либо потому что он
имеет данные для чтения, ЛИБО потому что он в состоянии EOF. */
if (strlen($data) == 0) {
echo "Stream " . $id . " closes at " . date('h:i:s') . ".\n";
fclose($r);
unset($sockets[$id]);
} else {
$result[$id] .= $data;
}
}
} else {
/* Таймаут означает, что *все* потоки не
дождались получения ответа. */
echo "Time-out!\n";
break;
}
}
?>
от знакомых узнал что есть такая отличная фишка на курле - многопоточность
Смеяться или плакать?
Твои знакомые тебе наврали,наглым образом.
Engineer
14.11.2009, 22:15
Почему? В инете полно информации на эту тему.
Хотя возможно ты и прав, спорить не буду, это не совсем многопоточность но по словам разработчиков ibm.com это может заметно увеличить отдачу, в моем случае это бы помогло вести реальные логи посещений ( т.к. сейчас некоторые запросы просто не доходят до адресата )
Engineer
14.11.2009, 22:31
гугли в сторону pcntl
О спасибо! Буду разбираться.
Но хотелось бы услышать мнение разбирающихся людей и по данному вопросу
О спасибо! Буду разбираться.
Но хотелось бы услышать мнение разбирающихся людей и по данному вопросу
Я тебе свое мнение высказал.Переписывай на Perl or Python.Благо,на форуме ты можеш все найти,останеться только соединить в то что ты хочеш,а извращение с мультикурлом и сокетами - это....пи****.Но так как я личность крайне глупая,меня можно и не слушать,и ждать PHP 6.
Engineer
14.11.2009, 23:34
Да успакойся ты :) разберусь в этом вопросе потм попробую на питоне написать, и вовсе ты не глупый )))
Кстати не думаю что в 6 версии многопоточность появится, скорре всего придумают еще одно подобное извращение, т.к. где то читал что тесты внедрения параллелизма провалились....
меня можно и не слушать,и ждать PHP 6.
Зачем ждать?)) Бери...
http://snaps.php.net/
ЗЫ Поток, процесс, и мультикурл - это 3 разные вещи. Мультикурлом или пулом неблокирующих сокетов можно конечно поднять скорость, но все же ето не многопоточность, не путайте праведное с грешным.
Engineer, не пиши по несколько постов подряд, а то в бан на профилактику пойдёшь...учись пользоваться кнопкой редактировнаия
по теме: в php многопоточности НЕТ ... в php 6 не смотря на все обещания тоже его не жду...максимум какие нибудь костыли сделают...
согласен с m0Hze ... перепиши на том же perl ... и куча доков (в том числе русских) и синтаксис простой и многопоточность
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot