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

Discussion in 'PHP' started by DaeWoo, 23 Feb 2011.

  1. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Собственно есть скрипт.

    PHP:
    $old c("edit4")->text;
    $next c("edit5")->text;
    $comment c("memo1")->text;
    $login c("edit2")->text;
    $pass c("edit3")->text;
    $xy =  rand(0,30);
    $url c("edit1")->text;
    for(
    $i=$old;$i<$next;$i++)
    {
    $ch curl_init();
    curl_setopt($chCURLOPT_URL"$url/index.php");
    curl_setopt ($chCURLOPT_POST1);
    curl_setopt ($chCURLOPT_POSTFIELDS"login_name=$login&login_password=$pass&login=submit&image.x=$xy&image.y=$xy");
    curl_setopt ($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_COOKIESESSIONTRUE);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt ($chCURLOPT_COOKIEJAR'cook.txt');
    curl_setopt ($chCURLOPT_COOKIEFILE'cook.txt');
    $result curl_exec ($ch);
     
    curl_close ($ch);

    $ch curl_init();
    curl_setopt($chCURLOPT_URL"$url/engine/ajax/addcomments.php");
    curl_setopt ($chCURLOPT_POST1);

    curl_setopt ($chCURLOPT_POSTFIELDS"comments=$comment&name=$login&mail=&skin=Default&allow_subscribe=0&post_id=$i&rndval=1298206420478");

    curl_setopt ($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_COOKIESESSIONTRUE);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt ($chCURLOPT_COOKIEJAR'cook.txt');
    curl_setopt ($chCURLOPT_COOKIEFILE'cook.txt');
    $result_pm curl_exec ($ch);
     
    curl_close ($ch);

     
    print_r("Добавлено в  id=$i
     "
    );

     
    ///print_r($result_pm);
     
    }
    Отправляет сообщения в новости, но очень медленно.
    Подскажите пожалуйста как сделать что бы ПОСТ запрос передавался в несколько потоков?
    В гугл не посылайте, перекурил всё что можно но подробного так и ничего не нашел или всё запутанно.
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    DaeWoo http://php.net/curl_multi_init
     
    _________________________
  3. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    PHP:
    $old c("edit4")->text;
    $next c("edit5")->text;
    $comment c("memo1")->text;
    $login c("edit2")->text;
    $pass c("edit3")->text;
    $xy =  rand(0,30);
    $url c("edit1")->text;


    $ch1 curl_init();
    $ch2 curl_init();
    curl_setopt($ch1CURLOPT_URL"$url/index.php");
    curl_setopt ($ch1CURLOPT_POST1);
    curl_setopt ($ch1CURLOPT_POSTFIELDS"login_name=$login&login_password=$pass&login=submit&image.x=$xy&image.y=$xy");
    curl_setopt ($ch1CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch1CURLOPT_COOKIESESSIONTRUE);
    curl_setopt($ch1CURLOPT_HEADER0);
    curl_setopt ($ch1CURLOPT_COOKIEJAR'cook.txt');
    curl_setopt ($ch1CURLOPT_COOKIEFILE'cook.txt');
    curl_setopt($ch2CURLOPT_URL"$url/engine/ajax/addcomments.php");
    curl_setopt ($ch2CURLOPT_POST1);
    for(
    $i=$old;$i<$next;$i++)
    {
    curl_setopt ($ch2CURLOPT_POSTFIELDS"comments=$comment&name=$login&mail=&skin=Default&allow_subscribe=0&post_id=$i&rndval=1298206420478");
    curl_setopt ($ch2CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch2CURLOPT_COOKIESESSIONTRUE);
    curl_setopt($ch2CURLOPT_HEADER0);
    curl_setopt ($ch2CURLOPT_COOKIEJAR'cook.txt');
    curl_setopt ($ch2CURLOPT_COOKIEFILE'cook.txt');

    //create the multiple cURL handle
    $mh curl_multi_init();

    //add the two handles
    curl_multi_add_handle($mh,$ch1);
    curl_multi_add_handle($mh,$ch2);

    $running=null;
    //execute the handles
    do {
        
    usleep(10);
        
    curl_multi_exec($mh,$running);
    } while (
    $running 0);

    //close the handles
    curl_multi_remove_handle($mh$ch1);
    curl_multi_remove_handle($mh$ch2);
    curl_multi_close($mh);
    // print_r("Добавлено в id=$i
     //");

     ///print_r($result_pm);
     
    }
    Сделал по мануалу ничего не изменилось.
     
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    DaeWoo you doing it wrong. Ваша задача создать N хендлов курла, зарегистрировать их в curl_multi и запустить обработку. Сейчас же у вас не менее однопоточный код, чем был раньше.

    Грубо говоря:
    PHP:
    $ch curl_init('login_page'); // <-- Логинимся

    //create the multiple cURL handle
    $mh curl_multi_init();
    $mult = array();
    for(
    $i=0;$i<=10;$i++)
    {
    $mult[$i] = curl_init();
    // Прочие параметры от курла
    curl_multi_add_handle($mh$mult[$i]);
    }

    // Запускаем одновременную обработку
    $running=null;
    //execute the handles
    do {
        
    usleep(10);
        
    curl_multi_exec($mh,$running);
    } while (
    $running 0); 

    for(
    $i=0;$i<=10;$i++)
    {
    curl_multi_remove_handle($mh$multi[$i]); 
    }

    curl_multi_close($mh); 
    Однако не забывайте, что сервер может быть недоволен множественными коннектами и/или постингом
     
    _________________________
  5. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Эм... я в этом "нуб" не могли бы Вы сделать пример из кода показанного выше?
     
  6. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Получилось вот такое чудо

    PHP:
    $ch1 curl_init();
    $ch2 curl_init();
    curl_setopt($ch1CURLOPT_URL"$url/index.php");
    curl_setopt ($ch1CURLOPT_POST1);
    curl_setopt ($ch1CURLOPT_POSTFIELDS"login_name=$login&login_password=$pass&login=submit&image.x=$xy&image.y=$xy");
    curl_setopt ($ch1CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch1CURLOPT_COOKIESESSIONTRUE);
    curl_setopt($ch1CURLOPT_HEADER0);
    curl_setopt ($ch1CURLOPT_COOKIEJAR'cook.txt');
    curl_setopt ($ch1CURLOPT_COOKIEFILE'cook.txt');
    curl_setopt($ch2CURLOPT_URL"$url/engine/ajax/addcomments.php");
    curl_setopt ($ch2CURLOPT_POST1);
    for(
    $i=$old;$i<$next;$i++)
    {
    curl_setopt ($ch2CURLOPT_POSTFIELDS"comments=$comment&name=$login&mail=&skin=Default&allow_subscribe=0&post_id=$i&rndval=1298206420478");
    curl_setopt ($ch2CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch2CURLOPT_COOKIESESSIONTRUE);
    curl_setopt($ch2CURLOPT_HEADER0);
    curl_setopt ($ch2CURLOPT_COOKIEJAR'cook.txt');
    curl_setopt ($ch2CURLOPT_COOKIEFILE'cook.txt');
    }
    //create the multiple cURL handle
    $mh curl_multi_init();

    $mult = array();
    for(
    $a=0;$a<=10;$a++)
    {
    $mult[$a] = curl_init();

    //add the two handles
    curl_multi_add_handle($mh$ch1$multi[$a]);
    curl_multi_add_handle($mh$ch2$multi[$a]);
    }
    $running=null;
    //execute the handles
    do {
        
    usleep(10);
        
    curl_multi_exec($mh,$running);
    } while (
    $running 0);

    //close the handles
    for($a=0;$a<=10;$a++)
    {
    curl_multi_remove_handle($mh$ch1$multi[$a]);
    curl_multi_remove_handle($mh$ch2$multi[$a]);
    }
    curl_multi_close($mh);
    // print_r("OK id=$i
     //");

     ///print_r($result_pm);

    Но при запуске ругается на вот эту строку

    Что не так?
     
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    DaeWoo не пытайтесь совершать "магические" пассы руками над кодом. Попытайтесь прочитать документацию.

    http://php.net/curl_multi_add_handle и заодно http://php.net/curl_multi_remove_handle - обе функции принимают ровно 2 параметра
     
    _________________________
  8. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Перечитывал сверху до низу по 10 раз но так ничего и не понял.
     
  9. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Если тяжело разобраться как написать самому, возьмите готовое решение, класс: http://forum.antichat.ru/showpost.php?p=2569506&postcount=21
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    DaeWoo здесь не место торговле. Пробуйте:
    PHP:
    $ch1 curl_init();
    curl_setopt($ch1CURLOPT_URL$url."/index.php");
    curl_setopt($ch1CURLOPT_POST1);
    curl_setopt($ch1CURLOPT_POSTFIELDS"login_name=".$login."&login_password=".$pass."&login=submit&image.x=".$xy."&image.y=".$xy);
    curl_setopt($ch1CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch1CURLOPT_COOKIESESSIONTRUE);
    curl_setopt($ch1CURLOPT_HEADER0);
    curl_setopt($ch1CURLOPT_COOKIEJAR'cook.txt');
    curl_setopt($ch1CURLOPT_COOKIEFILE'cook.txt');
    curl_exec($ch1);

    $mult = array();
    $mh curl_multi_init();
    for(
    $i=$old;$i<$next;$i++)
    {
        
    $mult[$i] = curl_init();

        
    curl_setopt ($mult[$i], CURLOPT_RETURNTRANSFER1);
        
    curl_setopt ($mult[$i], CURLOPT_COOKIESESSIONTRUE);
        
    curl_setopt ($mult[$i], CURLOPT_HEADER0);
        
    curl_setopt ($mult[$i], CURLOPT_COOKIEJAR'cook.txt');
        
    curl_setopt ($mult[$i], CURLOPT_COOKIEFILE'cook.txt');
        
    curl_setopt ($mult[$i], CURLOPT_URL$url.'/engine/ajax/addcomments.php');
        
    curl_setopt ($mult[$i], CURLOPT_POST1);
        
    curl_setopt ($mult[$i], CURLOPT_POSTFIELDS"comments=".$comment."&name=".$login."&mail=&skin=Default&allow_subscribe=0&post_id=".$i."&rndval=1298206420478");

        
    curl_multi_add_handle($mh$multi[$a]);
    }

    //execute the handles
    $running=null;
    do {
        
    usleep(1000);
        
    curl_multi_exec($mh,$running);
    } while (
    $running 0);

    //close the handles
    for($i=$old;$i<$next;$i++)
    {
        
    curl_multi_remove_handle($mh$multi[$i]);
    }
    curl_multi_close($mh);
    curl_close($ch1);
     
    _________________________
  11. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Опечатался. Должно быть:
    curl_multi_add_handle($mh, $multi[$i]);
     
    _________________________
  13. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Та же ошибка
     
  14. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
  15. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    DaeWoo Только чувствую все равно работать не будет и серв отфутболит частые попытки соедниения
    PHP:
    <?PHP

    $ch1 
    curl_init();
    curl_setopt($ch1CURLOPT_URL$url."/index.php");
    curl_setopt($ch1CURLOPT_POST1);
    curl_setopt($ch1CURLOPT_POSTFIELDS"login_name=".$login."&login_password=".$pass."&login=submit&image.x=".$xy."&image.y=".$xy);
    curl_setopt($ch1CURLOPT_RETURNTRANSFER1);
    curl_setopt($ch1CURLOPT_COOKIESESSIONTRUE);
    curl_setopt($ch1CURLOPT_HEADER0);
    curl_setopt($ch1CURLOPT_COOKIEJAR'cook.txt');
    curl_setopt($ch1CURLOPT_COOKIEFILE'cook.txt');
    curl_exec($ch1);

    $mult = array();
    $mh curl_multi_init();
    for(
    $i=$old;$i<$next;$i++)
    {
        
    $mult[$i] = curl_init();

        
    curl_setopt ($mult[$i], CURLOPT_RETURNTRANSFER1);
        
    curl_setopt ($mult[$i], CURLOPT_COOKIESESSIONTRUE);
        
    curl_setopt ($mult[$i], CURLOPT_HEADER0);
        
    curl_setopt ($mult[$i], CURLOPT_COOKIEJAR'cook.txt');
        
    curl_setopt ($mult[$i], CURLOPT_COOKIEFILE'cook.txt');
        
    curl_setopt ($mult[$i], CURLOPT_URL$url.'/engine/ajax/addcomments.php');
        
    curl_setopt ($mult[$i], CURLOPT_POST1);
        
    curl_setopt ($mult[$i], CURLOPT_POSTFIELDS"comments=".$comment."&name=".$login."&mail=&skin=Default&allow_subscribe=0&post_id=".$i."&rndval=1298206420478");

        
    curl_multi_add_handle($mh$mult[$i]);
    }

    //execute the handles
    $running=null;
    do {
        
    usleep(1000);
        
    curl_multi_exec($mh,$running);
    } while (
    $running 0);

    //close the handles
    for($i=$old;$i<$next;$i++)
    {
        
    curl_multi_remove_handle($mh$mult[$i]);
    }
    curl_multi_close($mh);
    curl_close($ch1);  
     
    _________________________
  16. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Скрипт заработал, но что то особых изменений я не увидел.
    Тоесть программа при выполнении подвисала на несколько секунд так и сейчас.

    Может что то не так?

     
  17. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Подскажите пожалуйста.
     
  18. DaeWoo

    DaeWoo New Member

    Joined:
    10 Feb 2011
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    ап
    ап