Многопоточность Socket/cURL оно нам надо?

Discussion in 'PHP' started by Engineer, 14 Nov 2009.

  1. Engineer

    Engineer Member

    Joined:
    22 May 2009
    Messages:
    70
    Likes Received:
    5
    Reputations:
    0
    Доброго всем времени суток. На днях столкнулся с такой задачей - писал накрутчик, через несколько дней работы скрипта показалось что из него можно выжать больше переходов, от знакомых узнал что есть такая отличная фишка на курле - многопоточность, после нескольких тестов понял что скорость мне не удается увеличить... Сам я только начинаю разбираться во в языке php поэто я хотел бы посоветоваться с профессионалами.
     
  2. Engineer

    Engineer Member

    Joined:
    22 May 2009
    Messages:
    70
    Likes Received:
    5
    Reputations:
    0
    Собственно вот простенький пример
    <?
    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);
    }
    ?>
     
    #2 Engineer, 14 Nov 2009
    Last edited: 14 Nov 2009
  3. Engineer

    Engineer Member

    Joined:
    22 May 2009
    Messages:
    70
    Likes Received:
    5
    Reputations:
    0
    Мнение к которому я пришел возможно ошибочно но я решил что при использовании таких функциё как stream_socket_client и stream_select всего лишь разбивает наш поток на две части т.е - 1 запрос 2 ответ. Но как вы видите вторую функцию я не стал использовать т.к ответ меня не интересует(ведь скрипт всего лишь генерит запросы)
    PS не нужно строго судить я всего лишь хочу в этом разобраться, а многопоточность я так и не смог внедрить.... Помогите разобраться
     
  4. Engineer

    Engineer Member

    Joined:
    22 May 2009
    Messages:
    70
    Likes Received:
    5
    Reputations:
    0
    Если кому то интересно вот скрипт с многопоточностью. Оригинальная тема на 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;
    }
    }
    ?>
     
  5. Engineer

    Engineer Member

    Joined:
    22 May 2009
    Messages:
    70
    Likes Received:
    5
    Reputations:
    0
    Почему? В инете полно информации на эту тему.
    Хотя возможно ты и прав, спорить не буду, это не совсем многопоточность но по словам разработчиков ibm.com это может заметно увеличить отдачу, в моем случае это бы помогло вести реальные логи посещений ( т.к. сейчас некоторые запросы просто не доходят до адресата )
     
    #5 Engineer, 14 Nov 2009
    Last edited: 14 Nov 2009
  6. LEE_ROY

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

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    гугли в сторону pcntl
     
    1 person likes this.
  7. Engineer

    Engineer Member

    Joined:
    22 May 2009
    Messages:
    70
    Likes Received:
    5
    Reputations:
    0
    О спасибо! Буду разбираться.
    Но хотелось бы услышать мнение разбирающихся людей и по данному вопросу
     
  8. Engineer

    Engineer Member

    Joined:
    22 May 2009
    Messages:
    70
    Likes Received:
    5
    Reputations:
    0
    Да успакойся ты :) разберусь в этом вопросе потм попробую на питоне написать, и вовсе ты не глупый )))
    Кстати не думаю что в 6 версии многопоточность появится, скорре всего придумают еще одно подобное извращение, т.к. где то читал что тесты внедрения параллелизма провалились....
     
    #8 Engineer, 14 Nov 2009
    Last edited: 15 Nov 2009
  9. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Зачем ждать?)) Бери...
    http://snaps.php.net/

    ЗЫ Поток, процесс, и мультикурл - это 3 разные вещи. Мультикурлом или пулом неблокирующих сокетов можно конечно поднять скорость, но все же ето не многопоточность, не путайте праведное с грешным.
     
  10. Sharky

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

    Joined:
    1 May 2006
    Messages:
    487
    Likes Received:
    312
    Reputations:
    46
    Engineer, не пиши по несколько постов подряд, а то в бан на профилактику пойдёшь...учись пользоваться кнопкой редактировнаия

    по теме: в php многопоточности НЕТ ... в php 6 не смотря на все обещания тоже его не жду...максимум какие нибудь костыли сделают...

    согласен с m0Hze ... перепиши на том же perl ... и куча доков (в том числе русских) и синтаксис простой и многопоточность