За последние 24 часа нас посетили 23239 программистов и 1552 робота. Сейчас ищут 985 программистов ...

multi curl

Тема в разделе "PHP для новичков", создана пользователем Slavka, 22 дек 2016.

  1. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    доброе время суток

    взял какойто пример с аналов инета
    PHP:
    1. <?php
    2. $urls = array(
    3.     'http://graph.facebook.com/http://tech.vg.no',
    4.     'http://graph.facebook.com/http://www.vg.no',
    5. );
    6. $multi = curl_multi_init();
    7. $channels = array();
    8. foreach ($urls as $url) {
    9.     $ch = curl_init();
    10.     curl_setopt($ch, CURLOPT_URL, $url);
    11.     curl_setopt($ch, CURLOPT_HEADER, false);
    12.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    13.     curl_multi_add_handle($multi, $ch);
    14.     $channels[$url] = $ch;
    15. }
    16. $active = null;
    17. do {
    18.     $mrc = curl_multi_exec($multi, $active);
    19. } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    20. while ($active && $mrc == CURLM_OK) {
    21.     if (curl_multi_select($multi) == -1) {
    22.         continue;
    23.     }
    24.     do {
    25.         $mrc = curl_multi_exec($multi, $active);
    26.     } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    27. }
    28. foreach ($channels as $channel) {
    29.     echo curl_multi_getcontent($channel);
    30.     curl_multi_remove_handle($multi, $channel);
    31. }
    чтобы понять что к чему и после чего - тупо открыл ссылки ( проверил работоспособность - отдает json ) все ок.

    запустил скрипт и на этапе

    if (curl_multi_select($multi) == -1

    застрял - он мне всегда только -1 и дает ..
    попробовал еше 1 скрипт - опять на -1 стопорится - даже сервак перезапускать приходится


    непойму чего не так ..
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    скопипастил

    14797 apache2 20 0 324612 11652 2256 R 49,91 0,566 1:03.06 httpd2
    14800 apache2 20 0 324612 11652 2256 R 49,58 0,566 1:36.83 httpd2

    красным - загрузка проца -)

    и нулевой результат
    --- Добавлено ---
    опять там же - мне всегда приходит -1 в
    if(curl_multi_select($multi)==-1){
    --- Добавлено ---
    если не лень - а у тебя эта штука работает ?
    с обычным курлом у меня проблем нету ..
    а вот как до мульти дошел ... черти что началось
    --- Добавлено ---
    о шас попробую на своем компе запустить ( без апача на серваке пыха)
    --- Добавлено ---
    фигушки - загрузка ядра 100% .. и толку ноль

    чтото тут не так ..
    --- Добавлено ---
    а вот так работает ( по первому примеру)
    http://ru.stackoverflow.com/questions/367010/multi-curl-пропускает-5-10-ответов
    PHP:
    1. <?php
    2. $urls = array(
    3.     'http://graph.facebook.com/http://tech.vg.no',
    4.     'http://graph.facebook.com/http://www.vg.no',
    5. );
    6. $mh = curl_multi_init();  
    7.             $connectionArray = array();
    8.             foreach($urls as $key => $url)
    9.         {
    10.                 $ch = curl_init();
    11.                 curl_setopt($ch, CURLOPT_URL, $url);
    12.                 curl_setopt($ch, CURLOPT_HEADER, false);
    13.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    14.                 curl_multi_add_handle($mh, $ch);
    15.                 $connectionArray[$key] = $ch;
    16.         }
    17.         $running = null;
    18.         do
    19.         {
    20.             curl_multi_exec($mh, $running);
    21.         }while($running > 0);
    22.  
    23.         foreach($connectionArray as $key => $ch)
    24.         {
    25.             //здесь получаю контент страницы
    26.             echo curl_multi_getcontent($ch)."<br>";
    27.             curl_multi_remove_handle($mh, $ch);
    28.         }
    29.  
    30.         curl_multi_close($mh);
    31.        
     
  4. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    я юзал в свое время мультикурл...в итоге бах..и не работает....ковырялся дня три вместе с хостером у которого сервер брали..в итоге бан был на уровне другого дата центра с которого я пытался мультикурлом тянуть данные

    так что поаккуратнее )

    Мне кажется что на данный момент, когда 90% под защитой от ддоса это утопия его использовать
     
  5. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    а вот бан меня какраз меньше всего интересует ... =)
     
  6. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41
    PHP:
    1. <?php
    2. $urls = array(
    3.     'http://graph.facebook.com/http://tech.vg.no',
    4.     'http://graph.facebook.com/http://www.vg.no',
    5. );
    6. $mh = curl_multi_init();
    7.             $connectionArray = array();
    8.  
    9. //создается пул запросов
    10.  
    11.             foreach($urls as $key => $url)
    12.         {
    13.                 $ch = curl_init();
    14.                 curl_setopt($ch, CURLOPT_URL, $url);
    15.                 curl_setopt($ch, CURLOPT_HEADER, false);
    16.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    17.                 curl_multi_add_handle($mh, $ch);
    18.                 $connectionArray[$key] = $ch;
    19.         }
    20. // выполение этого пула - до последней загрузки
    21.         $running = null;
    22.         do
    23.         {
    24.             curl_multi_exec($mh, $running);
    25.         }while($running > 0);
    26.  
    27. //загрузились !
    28. получаем ВСЕ данные
    29.  
    30.  
    31.         foreach($connectionArray as $key => $ch)
    32.         {
    33.             //здесь получаю контент страницы
    34.             echo curl_multi_getcontent($ch)."<br>";
    35.             curl_multi_remove_handle($mh, $ch);
    36.         }
    37.         curl_multi_close($mh);

    ребят я хочу сделать пул из 20 ( но общее количество запросов будет около 1000)


    я никак не соображу как сделать после загрузки 1 задачи из пула - запуск на это место новой задачи

    во время выполнения пула нет возможности возвратить $ch - идентификатор конкретной задачи чтобы выташить ее из завершенной

    может кто что увидит - как это можно сделать ?
     
  7. Slavka

    Slavka Активный пользователь

    С нами с:
    1 окт 2013
    Сообщения:
    722
    Симпатии:
    41