curl_multi_exec показывает разные прогоны - PullRequest
0 голосов
/ 02 мая 2018

Я использую curl_multi_exec () всего за 5 URL. Теперь у меня есть эта странная проблема. Когда я запускаю свой код на xampp, он отлично работает. я могу видеть $ идущее значение, инициализированное с 5, и затем продолжает уменьшаться. , Но, когда я попробовал это на другом localhost (на архитектуре arm), $ running инициализируется с 0. поэтому мой curl_multi_exec () никогда не возвращает никакого ответа.

Вот фрагмент кода:

<code>do {
curl_multi_exec($master,$running);
echo "<pre>";
var_dump($running );
echo "
"; } while ($ running> 0);

Вот весь мой код:

<code>    $nodes = array( 'https://www.example.com',
            'https://www.example2.com',
            'https://www.example3.com',
            'https://www.example4.com',
            'https://www.example5.com'
            );
    $node_count = count($nodes);

    $curl_arr = array();
    $master = curl_multi_init();
    for($i = 0; $i < $node_count; $i++)
    {
    $url =$nodes[$i];
    $curl_arr[$i] = curl_init($url);
    curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($master, $curl_arr[$i]);  
    }

    do {
   curl_multi_exec($master,$running);
   echo "<pre>";
   var_dump($running );
   echo "
"; } while ($ running> 0); для ($ i = 0; $ i

Я прогуглил несколько вещей и узнал, что curl ssl может быть проблемой. Итак, я установил еще один локальный хост (на ARM) с включенными openssl и curl ssl. Теперь у меня есть два разных localhost (оба для ARM) с включенным SSL, этот фрагмент отлично работает на одном localhost и не работает на другом.

И почему-то мне нужен этот "другой", потому что он имеет гораздо больше функций.

Кто-нибудь, пожалуйста, объясните, в чем может быть проблема с этой $ идущей инициализацией?

Любая помощь приветствуется:)

Пробовал это тоже, но безуспешно

                                    <?php

            // echo "<meta http-equiv='refresh' content='3'/>" ;

                include_once ("simple_html_dom.php");
                libxml_use_internal_errors(true);

            function get_string_between($string, $start, $end){
                $string = ' ' . $string;
                $ini = strpos($string, $start);
                if ($ini == 0) return '';
                $ini += strlen($start);
                $len = strpos($string, $end, $ini) - $ini;
                return substr($string, $ini, $len);
            }

            function multi_thread_curl($url_array, $number_threads) {
             $curl_array = array_chunk($url_array, $number_threads, $preserve_keys = true);
            //Iterate through each batch of urls.
            foreach($curl_array as $threads) {
                //Create your cURL resources.
                foreach($threads as $key=>$value) {
                ${'ch' . $key} = curl_init();
                curl_setopt(${'ch' . $key}, CURLOPT_URL, $value);
                curl_setopt(${'ch' . $key}, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt(${'ch' . $key}, CURLOPT_RETURNTRANSFER, true);
                curl_setopt(${'ch' . $key}, CURLOPT_TIMEOUT, 10);

                }
                //Create the multiple cURL handler.
                $mh = curl_multi_init();

                //Add the handles.
                foreach($threads as $key=>$value) {

                curl_multi_add_handle($mh, ${'ch' . $key});

                }

                $active = null;

                //execute the handles.
                do {

                $mrc = curl_multi_exec($mh, $active);

                } while ($mrc == CURLM_CALL_MULTI_PERFORM);

                while ($active && $mrc == CURLM_OK) {
                    echo $active;

                    if (curl_multi_select($mh) != -1) {
                        do {

                            $mrc = curl_multi_exec($mh, $active);

                        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
                    }
                }
                //Get your data and close the handles.
                foreach($threads as $key=>$value) {
                $results[$key] = curl_multi_getcontent(${'ch' . $key});
                curl_multi_remove_handle($mh, ${'ch' . $key});
                }
                //Close the multi handle exec.
                curl_multi_close($mh);
            }
            return $results;
            }
            $nodes = array( 'https://www.example1.com',
                            'https://www.example2.com',
                            'https://www.example3.com',
                            'https://www.example4.com',
                            'https://www.example5.com',
                            );
            $node_count = count($nodes);
            echo "results: ";
            $number_threads = 5;
            $results = multi_thread_curl($nodes, $number_threads);
            print_r($results);
            echo 'done';


            ?>

Issue Here: $active is always 5. Forever Loop: (

1 Ответ

0 голосов
/ 02 мая 2018

Вот функция многопоточности, которую я собрал, используя примеры из PHP.net. Я использовал эту функцию для получения большого количества URL. Он способен реально ускорить процесс. У меня был большой успех с этим.

Вы можете даже расширить его и добавить параметр для ваших параметров скручивания.

function multi_thread_curl($url_array, $number_threads) {


$curl_array = array_chunk($url_array, $number_threads, $preserve_keys = true);

    //Iterate through each batch of urls.
    foreach($curl_array as $threads) {

        //Create your cURL resources.
        foreach($threads as $key=>$value) {

        ${'ch' . $key} = curl_init();

        curl_setopt(${'ch' . $key}, CURLOPT_URL, $value);
        curl_setopt(${'ch' . $key}, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt(${'ch' . $key}, CURLOPT_RETURNTRANSFER, true);
        curl_setopt(${'ch' . $key}, CURLOPT_TIMEOUT, 10);

        }


        //Create the multiple cURL handler.
        $mh = curl_multi_init();

        //Add the handles.
        foreach($threads as $key=>$value) {

        curl_multi_add_handle($mh, ${'ch' . $key});

        }

        $active = null;

        //execute the handles.
        do {

        $mrc = curl_multi_exec($mh, $active);

        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        while ($active && $mrc == CURLM_OK) {

            if (curl_multi_select($mh) != -1) {
                do {

                    $mrc = curl_multi_exec($mh, $active);

                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }

        }

        //Get your data and close the handles.
        foreach($threads as $key=>$value) {

        $results[$key] = curl_multi_getcontent(${'ch' . $key});

        curl_multi_remove_handle($mh, ${'ch' . $key});

        }

        //Close the multi handle exec.
        curl_multi_close($mh);

    //Limits to one group of threads.
    //break;

    }


    return $results;



}

$urls = array(

  'https://en.wikipedia.org/wiki/Wiki'

);


$results = multi_thread_curl($urls, 1);

print_r($results);
...