Nano Hash - криптовалюты, майнинг, программирование

Curl Multi и обратный перенос

Мне нужно сделать несколько запросов curl к одному и тому же домену один за другим, но я не могу делать их параллельно.

Я нашел следующий пример кода по адресу http://technosophos.com/content/connection-sharing-curl-php-how-re-use-http-connections-knock-70-rest-network-time

который хорошо работает для ускорения повторных вызовов curl.

function get2($url) {
// Create a handle.
$handle = curl_init($url);

 // Set options...

 // Do the request.
 $ret = curlExecWithMulti($handle);

 // Do stuff with the results...

 // Destroy the handle.
 curl_close($handle);


   }

   function curlExecWithMulti($handle) {

// In real life this is a class variable.
  static $multi = NULL;

 // Create a multi if necessary.
if (empty($multi)) {
 $multi = curl_multi_init();
  }

 // Add the handle to be processed.
 curl_multi_add_handle($multi, $handle);

 // Do all the processing.
  $active = NULL;
do {
 $ret = curl_multi_exec($multi, $active);
 } while ($ret == CURLM_CALL_MULTI_PERFORM);

 while ($active && $ret == CURLM_OK) {
    if (curl_multi_select($multi) != -1) {
   do {
      $mrc = curl_multi_exec($multi, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
}

 // Remove the handle from the multi processor.
 curl_multi_remove_handle($multi, $handle);

 return TRUE;
 }

Я несколько раз пытался установить параметры завитка, чтобы функция curlExecWithMulti($handle) возвращала результаты завитка в виде переменной, но пока безуспешно.

Можно ли это сделать?

28.10.2013

  • что ты имеешь в виду? Вы делаете return TRUE;, так что же вы ожидаете получить, кроме TRUE? 28.10.2013
  • Извините, это был просто пример кода с сайта technosophos.com для справки. Я пытался вернуть значение $ret, но не смог заставить это работать. 28.10.2013
  • какое значение вы ожидаете получить. Проверьте это php.net/manual/en/function.curl-multi- exec.php 28.10.2013

Ответы:


1

Возможно, это будет интересно, очень легко понять. Он будет выполнять ваши многократные запросы curl, а затем возвращать массив результатов, а также curl POST.

<?php
//demo receiver
if($_SERVER['REQUEST_METHOD']=='POST'){
    echo $_POST['post_var'];
    die;
}

/**
 * CURL GET|POST Multi
 */
function curl_multi($data, $options = array()) {
    $curly = array();
    $result = array();

    $mh = curl_multi_init();
    foreach ($data as $id=>$d) {
        $curly[$id] = curl_init();
        $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;

        $header[0]="Accept: text/xml,application/xml,application/xhtml+xml,application/json";
        $header[0].="text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        $header[]="Cache-Control: max-age=0";
        $header[]="Connection: keep-alive";
        $header[]="Keep-Alive: 2";
        $header[]="Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
        $header[]="Accept-Language: en-us,en;q=0.5";
        $header[]="Pragma: ";
        curl_setopt($curly[$id], CURLOPT_URL,            $url);
        curl_setopt($curly[$id], CURLOPT_HEADER,         0);
        curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curly[$id], CURLOPT_TIMEOUT,        30);
        curl_setopt($curly[$id], CURLOPT_USERAGENT,      "cURL (http://".$_SERVER['SERVER_NAME'].")");
        curl_setopt($curly[$id], CURLOPT_HTTPHEADER,     $header);
        curl_setopt($curly[$id], CURLOPT_REFERER,        $url);
        curl_setopt($curly[$id], CURLOPT_ENCODING,       'gzip,deflate');
        curl_setopt($curly[$id], CURLOPT_AUTOREFERER,    true);
        curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, true);
        // post?
        if (is_array($d)) {
            if (!empty($d['post'])) {
                curl_setopt($curly[$id], CURLOPT_POST,       1);
                curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
            }
        }
        // extra options?
        if (!empty($options)) {
            curl_setopt_array($curly[$id], $options);
        }
        curl_multi_add_handle($mh, $curly[$id]);
    }
    $running = null;
    do {
        curl_multi_exec($mh, $running);
    } while($running > 0);
    foreach($curly as $id => $c) {
        $result[$id] = curl_multi_getcontent($c);
        curl_multi_remove_handle($mh, $c);
    }
    curl_multi_close($mh);
    return $result;
}

$request = array(
    array('url'=>'http://localhost:8080/testing.php','post'=>array('post_var'=>'a')),
    array('url'=>'http://localhost:8080/testing.php','post'=>array('post_var'=>'b')),
    array('url'=>'http://localhost:8080/testing.php','post'=>array('post_var'=>'c')),
);
$curl_result = curl_multi($request);

/*
Array
(
    [0] => a
    [1] => b
    [2] => c
)
*/
echo '<pre>'.print_r($curl_result, true).'</pre>';
?>
28.10.2013
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..