Многопоточность в Php

Discussion in 'PHP' started by St__one, 30 Sep 2006.

  1. St__one

    St__one Elder - Старейшина

    Joined:
    5 Jul 2006
    Messages:
    24
    Likes Received:
    6
    Reputations:
    6
    Тут идея пришал одна по релазации многопоточности в php путём клона кода
    Code:
    <?php
    echo "hello";
    echo '<html>...ect';
    
    <?php
    $go = $_POST['go'];           //пуск
    $potok = $_POST['potok']; //сколько потоков
    $numberscript = n;            // номер скрипта
    $a = $potok - $numberscript;
    if(!$go, $a >= 0)
    {
    echo "ok";// любой код при работе с массивами можно прибавить $numberscript таким образом разбив задачу на потоки
    }
    ?>
    
    <?php
    $go = $_POST['go'];           //пуск
    $potok = $_POST['potok']; //сколько потоков
    $numberscript = n;            // номер скрипта
    $a = $potok - $numberscript;
    if(!$go, $a >= 0)
    {
    echo "ok";// любой код при работе с массивами можно прибавить $numberscript таким образом разбив задачу на потоки
    }
    ?>
    
    <?php
    $go = $_POST['go'];           //пуск
    $potok = $_POST['potok']; //сколько потоков
    $numberscript = n;            // номер скрипта
    $a = $potok - $numberscript;
    if(!$go, $a >= 0)
    {
    echo "ok";// любой код при работе с массивами можно прибавить $numberscript таким образом разбив задачу на потоки
    }
    ?>
    
    ...........
    
    <?php
    $go = $_POST['go'];           //пуск
    $potok = $_POST['potok']; //сколько потоков
    $numberscript = n;            // номер скрипта
    $a = $potok - $numberscript;
    if(!$go, $a >= 0)
    {
    echo "ok";// любой код при работе с массивами можно прибавить $numberscript таким образом разбив задачу на потоки
    }
    ?>
    
    Сделал небольшой набросочек
    ИМХО должно работать???!!!
     
  2. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Костыль на костыле костылем погоняет.

    Зачем нужна многопоточность на пхп? Всякие бруты и т.д.? Тогда зачем ПХП? Питон в лапы(или перл для извращенцев) и вперед на мины. Ибо уже куча модулей.

    А тем, кто не хочет учить питон, предлагаю курить доки про форки.
     
  3. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    2St__one вы норкоман?
     
    1 person likes this.
  4. St__one

    St__one Elder - Старейшина

    Joined:
    5 Jul 2006
    Messages:
    24
    Likes Received:
    6
    Reputations:
    6
    2nerezus: Я же написал на многопоточность на php... Конечно согласен, что реализация путем клонирования кода не самая лучшая...

    Для чего надо??? Например: написать сокс чекер на php в потоков 50-100

    2ZaCo: Нет не наркоман
     
  5. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    2St__one 1) у тебя в коде вложенные конструкции начала пхп-кода 2) я не пойму ка кты решил этим делать многопоточность... с таким же успехом можно позапускать несколько копий пхп. а тут у тебя код последовательно выполняется. или я дурак. какой n?? я не понимаю
     
  6. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    форком
     
  7. Ch3ck

    Ch3ck Elder - Старейшина

    Joined:
    9 Jun 2006
    Messages:
    1,363
    Likes Received:
    1,192
    Reputations:
    430
    Хм, чё-то так много написал... а разве нельзя было в цикл поставить. тоже самое было бы.
     
    1 person likes this.
  8. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    А мне проще 5 раз скрипт запустить. Вот вам и многопаточность :d
     
    1 person likes this.
  9. St__one

    St__one Elder - Старейшина

    Joined:
    5 Jul 2006
    Messages:
    24
    Likes Received:
    6
    Reputations:
    6
    2ZaCo: не закрыл, торопился это лишь набросок, чтобы понять мысль
    n это номер скрипта(0, 1, 2 .... так далее) )))

    2Dr.Check: цикл будте выполняться послелодвательно

    2fucker"ok: а 100 проще?
     
  10. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    http://www.stableversion.com/2006/04/17/multithread-php/
    вот тебе нормальная "многопоточность", хватит извращаться
     
    #10 KSURi, 30 Sep 2006
    Last edited: 30 Sep 2006
  11. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    2KSURi это еще хуже :)
    2St__one полный бред понимаешь?
     
  12. Pochka

    Pochka Banned

    Joined:
    26 Nov 2005
    Messages:
    27
    Likes Received:
    7
    Reputations:
    -2
    Кто тебе поведал? Конечно неблокирующим вводом\выводом в т.ч. в/из сокетов многопоточность в полном смысле слова заменить нельзя, но для подавляющего большинства всех задач, которые захотят решать местные Хакеры этого будет вполне достаточно
     
  13. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    +1, такого бреда давно не видел )
     
  14. off

    off Banned

    Joined:
    21 Aug 2006
    Messages:
    55
    Likes Received:
    37
    Reputations:
    6
    На каком – то сайте видел вот такой пример «многопоточности». Тут естественно идёт симуляция, т.к. в php многопоточности нет. Пример никогда не использовал, т.к. так и не встретился с задачей в которой это хоть чем то помогло.


    PHP:
    config.php

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

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

     

    launcher.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; 
    может кому то пригодится ...
     
  15. Pochka

    Pochka Banned

    Joined:
    26 Nov 2005
    Messages:
    27
    Likes Received:
    7
    Reputations:
    -2
    =) Это нам только что показывали, здесь "многопоточность" реализована безобразно, но смысл понятен, если сделать тоже самое с функциями socket_ и использованием селеста, то можно сделать замечательно работающие программы с распараллеленной работой с серверами (например для брута, скана и т.д. Так же таким образом делается кроссплатформенные серверы на PHP)
     
  16. Sw%00p

    Sw%00p Banned

    Joined:
    13 Apr 2006
    Messages:
    47
    Likes Received:
    8
    Reputations:
    8
    правильно в пхп нет многопоточности так как пхп это интерпретаторны а не компиляторный язык программинга
    в пхп разные части кода одновременно выполнять нльзя и циклы это не многопоточность если тока в одном цикле не указатть к примеру десять коннектов одновременно но всё же не закончив один коннект к другому не перейдёт он он же построчно читает и выполняет
    а компиляторные другое дело
     
  17. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    nerezus, zaco
    тем не менее этот пример довольно рапространен.
     
  18. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    с таким же успехом можно и system('php '.__file__) мутить) с передачей левого параметра. вообще согласен с Pochka - елси необходимо реализовывать многопоточность для работы с сокетами то лучше просто юзать их в неблокирующем режиме... только вот функции для этого не вкулючены по-умолчанию - используем php_sockets.
    2Sw%00p а перл с питоном это бабушкины сказки?) что мешает выполнять многопоточность в скриптовом языке программирования? разве интерпретатор не может этого уследить?
     
    #18 ZaCo, 30 Sep 2006
    Last edited: 30 Sep 2006
  19. SMiX

    SMiX Elder - Старейшина

    Joined:
    25 Jul 2005
    Messages:
    227
    Likes Received:
    55
    Reputations:
    29
    Бэмц. Не в состоянии сейчас ситать весь топик, скажу из своего опыта - pcntl - спец. модуль пхп для многопоточности. Чтобы была поддержка, нужно компиллить с опцией --with-pcntl. Также можно делать exec('php thread.php параметры_или_файл_с_сериалайзнутым_массивом_параметров &') system('аналогично') и прочее. Для каждого случая нужен свой способ: если вы пишете для себя, можно юзеть pcntl, если какой-нибудь скрипт, предназначенный для массового распространения, лучше юзать системные вызовы, т.к. pcntl установлен далеко не везде, а рут есть не у всех сами понимаете :). Некоторые еще извращаются с ифреймами... Но по мне так если скрипт многопоточный, значит он серьезный, и тут мне больше нравится консольная реализация. Можно лишь написать админку с использованием хтмл, которая, в свою очередь, будет запускать главный скрипт или сразу потоки... ВОт такой вот бред сбодуна получился :)
     
  20. Sw%00p

    Sw%00p Banned

    Joined:
    13 Apr 2006
    Messages:
    47
    Likes Received:
    8
    Reputations:
    8
    бля речь шла о пхп а не о перле как ты можешь в скрипте одновременно выполнить две процедуры да ни как интерпретатор читает построчно и выполняет поочереди
    а вот например в Делфи можно открыть букет сокетов вот те и многопоточность а в пхп невозможно тока из за того что он интерпретаторный
    опять таки цикл это не многопоточность
    если так говоришь про многопоточность то напарь
    любой скриптик где одновременно 10 коннектов было