Породия на многопоточность в php при помощи фрейма

Discussion in 'PHP' started by qaz, 22 Feb 2012.

  1. qaz

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

    Joined:
    12 Jul 2010
    Messages:
    1,551
    Likes Received:
    173
    Reputations:
    75
    Сегодня решил попробовать написать что то на подобии многопоточного чекера прокси, :D помню я когдато сливал базу через sql пхп скриптом, база была большая и я делал несколько файлов которые с ливали данные с продолжительной нумерацией, типа 1файл = 0 -100, 2файл = 100-200 и тд, и я решил в даном примере просто размножить скриптом множество фреймов на странице с такойже последовательностью обработки и вот что получилось.

    PHP:
    <?
    error_reporting(0);
    if(
    $_GET['mod'] == "number")
    {
    $start $_GET['start'];
    $end $_GET['end'];

    $file file_get_contents("proxy.txt");
    preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,9}#",$file,$act);

    $file "goodproxy.txt";
    $a fopen($file"a+");
    for(
    $i=$start;$i<=$end;$i++)
    {
    $proxy $act[0][$i];
    $timeout 10;
    // время на соединение с прокси
     
    $add explode(":""$proxy");

     
    $fp fsockopen($add[0], $add[1], $er$ers$timeout);
    if (!
    $fp) {} else {

    fwrite($a$add[0].":".$add[1]."\n");
    }
    fclose($a);


    }


    }else{
    $flow "50";
    // количество фреймов

    $file file_get_contents("proxy.txt");
    preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,9}#",$file,$act);
    $count count($act[0]);
    $result_flow round($count $flow) ;
    for(
    $i=0;$i<=$count;$i=$i+$result_flow )
    {
    $i2 $i+$result_flow 1;
    echo 
    "<iframe src='mpotok.php?mod=number&start=$i&end=$i2' frameborder='0' height='0' width='0'></iframe>";
    }
    }

    ?>

    поставил 50 фреймов рейльный ефект в 50 раз быстрее :D чем просто
    PHP:
    <?
    $file file_get_contents("proxy.txt");
    preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,9}#",$file,$act);

    $file "goodproxy.txt";
    $a fopen($file"a+");
    foreach(
    $act[0] as $proxy)
    {
    $timeout 10;
     
    $add explode(":""$proxy");
     
    $fp fsockopen($add[0], $add[1], $er$ers$timeout);
    if (!
    $fp) {
    } else {
    fwrite($a$add[0].":".$add[1]."\n");
    }
    }
    fclose($a);
    ?>
    Как вам моё творение? или ктото уже про многопоточность придумал лутше и я изобрёл велосипед?
     
    1 person likes this.
  2. R0nin

    R0nin Member

    Joined:
    11 Jul 2010
    Messages:
    261
    Likes Received:
    24
    Reputations:
    8

    Это скорее пародия на русского языка, чем на многопоточность :D
     
    #2 R0nin, 22 Feb 2012
    Last edited: 22 Feb 2012
  3. Chaak

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

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Молодец, а теперь попробуй вместо фреймов сделать все через exec, а в качестве объекта синхронизации пусть будет файл/база данных.
     
  4. DarkWave

    DarkWave New Member

    Joined:
    10 Oct 2011
    Messages:
    11
    Likes Received:
    2
    Reputations:
    0
    Вроде на неблокирующих сокетах можно "разогнаться", у меня даже что-то получалось.
    Есть ещё мультикурл.
     
  5. ocheretko

    ocheretko Banned

    Joined:
    15 May 2010
    Messages:
    144
    Likes Received:
    51
    Reputations:
    116
    можно легко сделать синхронизацию через базу, я делал так под винду:
    - создавал bat файл:
    PHP:
    :m
    wget http
    ://localhost:85/script_name/start.php -O null
    cls
    goto m
    Запускал этот бат файл другим бат файлом вот так:
    PHP:
    START 1thread.cmd
    START 1thread
    .cmd
    START 1thread
    .cmd
    START 1thread
    .cmd
    START 1thread
    .cmd
    START 1thread
    .cmd
    Останавливал все потоки таким бат файлом (kill.cmd):
    PHP:
    taskkill //IM cmd.exe

    wget и все батники ложил рядом со скриптами
    Все работает прекрасно до 30-40 поток, но дальше - крашится веб-сервер\пхп\еще что-то, так как это все неимоверно жрет ресурсы. И кстати ноут от перегрева вырубается.
    Переписав аналогичный скрипт на нет фреймворке - получил прирост в производительности в несколько раз, и уменьшение потребляемой памяти в десяток раз. А также - удобная и быстрая синхронизация потоков, блокировки и тд