curl_multi_exec показывает разные прогоны

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

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

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

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

    $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 "</pre>";
} while($running > 0);


for($i = 0; $i < $node_count; $i++)
{
$results = curl_multi_getcontent($curl_arr[$i]);
var_dump($results);
}

Я погуглил несколько вещей и узнал, что 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';


?>

Проблема здесь: $active is always 5, Навсегда петля 🙁

2

Решение

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

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

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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector