Доброго всем времени суток. На днях столкнулся с такой задачей - писал накрутчик, через несколько дней работы скрипта показалось что из него можно выжать больше переходов, от знакомых узнал что есть такая отличная фишка на курле - многопоточность, после нескольких тестов понял что скорость мне не удается увеличить... Сам я только начинаю разбираться во в языке php поэто я хотел бы посоветоваться с профессионалами.
Собственно вот простенький пример <? 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); } ?>
Мнение к которому я пришел возможно ошибочно но я решил что при использовании таких функциё как stream_socket_client и stream_select всего лишь разбивает наш поток на две части т.е - 1 запрос 2 ответ. Но как вы видите вторую функцию я не стал использовать т.к ответ меня не интересует(ведь скрипт всего лишь генерит запросы) PS не нужно строго судить я всего лишь хочу в этом разобраться, а многопоточность я так и не смог внедрить.... Помогите разобраться
Если кому то интересно вот скрипт с многопоточностью. Оригинальная тема на ibm.com <?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; } } ?>
Почему? В инете полно информации на эту тему. Хотя возможно ты и прав, спорить не буду, это не совсем многопоточность но по словам разработчиков ibm.com это может заметно увеличить отдачу, в моем случае это бы помогло вести реальные логи посещений ( т.к. сейчас некоторые запросы просто не доходят до адресата )
Да успакойся ты разберусь в этом вопросе потм попробую на питоне написать, и вовсе ты не глупый ))) Кстати не думаю что в 6 версии многопоточность появится, скорре всего придумают еще одно подобное извращение, т.к. где то читал что тесты внедрения параллелизма провалились....
Зачем ждать?)) Бери... http://snaps.php.net/ ЗЫ Поток, процесс, и мультикурл - это 3 разные вещи. Мультикурлом или пулом неблокирующих сокетов можно конечно поднять скорость, но все же ето не многопоточность, не путайте праведное с грешным.
Engineer, не пиши по несколько постов подряд, а то в бан на профилактику пойдёшь...учись пользоваться кнопкой редактировнаия по теме: в php многопоточности НЕТ ... в php 6 не смотря на все обещания тоже его не жду...максимум какие нибудь костыли сделают... согласен с m0Hze ... перепиши на том же perl ... и куча доков (в том числе русских) и синтаксис простой и многопоточность