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

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

Закрытая тема
Опции темы Опции просмотра
Старый 30.06.2010, 17:46   #1
Drunk Monk
Je suis moine ivre
 
Аватар для Drunk Monk
 
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
По умолчанию PHP Multi-threading

Кто как реализует многопоточность на пыхе?

Накидайте инфы по рабочим схемам, плиз
Drunk Monk вне форума  
Старый 30.06.2010, 17:58   #2
ne0zx
Senior Member
 
Аватар для ne0zx
 
Регистрация: 05.08.2009
Сообщений: 423
Бабло: $94751
По умолчанию

Если чето парсить - Rolling Curl

тут либа:
http://code.google.com/p/rolling-cur...ollingCurl.php

PHP код:
$rc = new RollingCurl("request_callback");
$rc->window_size 10;    //потоки


foreach ($urls as $url) {
    
$request = new Request($url);
    
$rc->add($request);
}
$rc->execute();


function 
request_callback($page$info) {

//сюда чего будем делать, когда пага скачалась


Вроде и POST слать можно, но я не умею, example не нашел
ne0zx вне форума  
Старый 30.06.2010, 18:04   #3
Drunk Monk
Je suis moine ivre
 
Аватар для Drunk Monk
 
Регистрация: 03.03.2009
Сообщений: 15,268
Бабло: $797172957
ТС -->
автор темы ТС По умолчанию

Спс, покурю.

Ну идеально, конечно, чтобы хуяк и запараллелить куски кода, но в принципе основной экшн на внешней активности: пост, гет...
Drunk Monk вне форума  
Старый 30.06.2010, 19:40   #4
XeonN
/dev/null
 
Аватар для XeonN
 
Регистрация: 16.09.2008
Адрес: Мариуполь / Украина
Сообщений: 805
Бабло: $2302714
Отправить сообщение для XeonN с помощью ICQ
По умолчанию

А кто что использует для многопоточного постинга?
XeonN вне форума  
Старый 30.06.2010, 19:50   #5
oso
кодер
 
Аватар для oso
 
Регистрация: 21.01.2008
Сообщений: 315
Бабло: $69585
По умолчанию

Как то замерял, больше 90% времени у скриптов уходило на коннекты, так что мультикурл вполне подходит. Правда, с проксями он плохо дружит..
Паралелить код можно с помощью pcntl, но там тоже свои ньансы (надо доустановить, и ресурсы тож жрет..)
__________________
php скрипты от $25 Отзывы: 2013-2011, 2010, 2009. acя: 384 846 ноль два шесть
oso вне форума  
Старый 30.06.2010, 21:19   #7
qazxcvbnm
Ниибаца крутой програмер
 
Аватар для qazxcvbnm
 
Регистрация: 04.08.2009
Сообщений: 904
Бабло: $177555
По умолчанию

config.php

PHP код:
// путь, где расположены скрипты
$path '_ttp://domain.com/path/';

// число потоков
$max_threads 20

launcher.php

PHP код:
require_once(”config.php”);

// инициализация

$sockets = array();
$done false;

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

$keywords fopen(”keywords.txt”“r”);

// приступаем к многопоточной работе

while (!$done)
{
    
// если обнаружен файл,
    // то прекращаем выполнение скрипта

    
if (file_exists(”stop-file”))
        die;

    
// если число запущенных потоков меньше
    // разрешенного максимума
    // то запускаем потоки еще

    
if ($max_threads count($sockets))
    {
        if (!
feof($keywords))
        {
            
$buffer = array();

            
// читаем ключевое слово
            // в реальности в этот массив можно
            // положить очень много всего
            // а не только одно ключевое слово…

            
$buffer[] = trim(fgets($keywords));

            
// задаем данные для запуска сокета
            // request.php - это тот файл,
            // который делает “дело”

            
$query_url $path “request.php”;
            
$url_info parse_url($query_url);

            
$url_info[port] = ($url_info[port]) ? $url_info[port] : 80;
            
$url_info[path] = ($url_info[path]) ? $url_info[path] : /;
            
$url_info[query] = ($url_info[query]) ? ?” $url_info[query] : “”;

            
// пакуем данные для передачи
            // в генерирующий скрипт
            // использование serialize очень удобно,
            // так как позволяет
            // залить в request.php мегабайты данных

            
$request serialize($buffer);

            
// формируем запрос для передачи по сокету

            
$query “POST ” $url_info[path] . ” HTTP/1.1\r\n”;
            
$query $query “Content-Typetext/xml\r\n”;
            
$query $query “Host” $url_info[host] . \r\n”;
            
$query $query “Content-length” . (strlen($request)) . \r\n\r\n”;
            
$query $query $request;

            
// создаем сокет, переводим его
            // в неблокирующий режим и запускаем
            // обработчик запросов

            
$errno 0;
            
$error “”;

            
$socket fsockopen($url_info[host], $url_info[port], $errno$error30);
            
stream_set_blocking($socket0);
            
stream_set_timeout($socket3600);
            
fputs($socket$query);

            
// запоминаем запущенный сокет

            
$sockets[md5(time())] = $socket;
        }
    }

    
// читаем данные из сокета. формально они нам
    // не нужны, но это позволяет
    // отработать обработчкику запросов

    
reset($sockets);
    while (
$socket current($sockets))
    {
        if (
feof($socket))
        {
            
// убиваем сокет, который отработал

            
unset($sockets[key($sockets)]);
        }
        else
        {
            
// читаем данные из сокета

            
$temp fgets($socket1000);
        }

        
// обрабатываем следующий сокет

        
next($sockets);
    }

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

    
sleep(1);

    
// если нет активных сокетов, то можно выходить

    
if (count($sockets) == 0)
        
$done true;
}

fclose($keywords);

die; 
stableversion.com/blog/mnogopotochnost_na_php
qazxcvbnm вне форума  
Старый 30.06.2010, 22:16   #8
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
По умолчанию

Цитата:
Сообщение от oso Посмотреть сообщение
Правда, с проксями он плохо дружит..
бред, с проксями там все нормально, включая socks4/5. У меня на php+multi_curl мультипоточный парсер-чекер проксей строчит только так. У кого не пашет или таймауты большие на socks, обновите либкурл до последней версии, только мне для этого пришлось php пересобирать руками.
про RollingCurl я уже писал в похожих топиках: нормальный класс, его можно брать за основу и дорабатывать по своим запросам.
вот здесь еще несколько слов про мульти поточность в php
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser
chesser вне форума  
Старый 30.06.2010, 23:11   #9
Домкрат
Дохуя дорвейщик
 
Аватар для Домкрат
 
Регистрация: 26.11.2008
Сообщений: 898
Бабло: $55079
По умолчанию

Писал на пыхе просто неимоверно быстрые парсилки, хуярсилки и прочую дребедень, на неблокирующихся сокетах. Написать с нуля что-то подобное очень тяжко, даже для бывалых прогеров, особенно если нету глубокого понимания принципов, но это и не обязательно, т.к. есть замечательная штука - nanoweb (ебанитесь, но это веб-сервер написанный на php), скачать его можно вот тут - http://nanoweb.si.kz/. Если руки растут откуда надо, то из него можно вытащить весь нужный функционал, который хорошо отлажен и прекрасно функционирует.
__________________
If you can dream - and not make dreams your master
Домкрат вне форума  
Старый 01.07.2010, 08:37   #10
Painkiller
Senior Member
 
Регистрация: 09.01.2010
Адрес: ☭
Сообщений: 203
Бабло: $39450
По умолчанию

Цитата:
Сообщение от qazxcvbnm Посмотреть сообщение
config.php

PHP код:

            $socket 
fsockopen($url_info[host], $url_info[port], $errno$error30);
            
stream_set_blocking($socket0);
            
stream_set_timeout($socket3600);
            
fputs($socket$query);


die; 
stableversion.com/blog/mnogopotochnost_na_php
здесь коннект блокируется как минимум.

p.s. извращенцы

Последний раз редактировалось Painkiller; 01.07.2010 в 12:54.
Painkiller вне форума