2014-09-25 2 views
6

Я пытаюсь выполнить запрос с использованием cURL асинхронным способом с обратным вызовом. Я использую кусок кода, который я копирую с сайта.PHP асинхронный cURL с обратным вызовом

Когда я пишу в своем браузере этот url: http://www.myhost:3049/exemplo/index/async/, он выполняет функцию asyncAction, которая выполняет функцию curl_post.

/** 
* Send a POST requst using cURL 
* @param string $url to request 
* @param array $post values to send 
* @param array $options for cURL 
* @return string 
*/ 
function curl_post($url, array $post = NULL, array $options = array()) 
{ 
    $defaults = array( 
     CURLOPT_POST => 1, 
     CURLOPT_HEADER => 0, 
     CURLOPT_URL => $url, 
     CURLOPT_FRESH_CONNECT => 1, 
     CURLOPT_RETURNTRANSFER => 1, 
     CURLOPT_FORBID_REUSE => 1, 
     CURLOPT_TIMEOUT => 4, 
     CURLOPT_POSTFIELDS => http_build_query($post) 
    ); 

    $ch = curl_init(); 
    curl_setopt_array($ch, ($options + $defaults)); 
    if(! $result = curl_exec($ch)) 
    { 
     $result = curl_error($ch); 
    } 
    curl_close($ch); 
    return $result; 
} 


public function asyncAction() { 
    $this->curl_post("http://www.myhost:3049/exemplo/index/add/"); 
} 

Затем локоны выполнить Curl к этому URL, чтобы выполнить действие, которое сейчас находится в том же классе, что другие функции, только для тестирования. Это действие addAction, которое просто возвращает строку с сообщением «CALLBACK».

function addAction() { 
    sleep(15); 
    return "CALLBACK"; 
} 

Результат $ возвращает только false. Возможно, проблема в том, что я прошу выполнить попытку выполнить действие, которое находится в том же классе, что и функция cURL. Но в любом случае, как я могу получить сообщение об ошибке. Есть ли лучшее решение, проверено и с хорошим объяснением об использовании в качестве асинхронного с обратным вызовом? Потому что то, что я читаю, не очень хорошо объяснено, а также не объясняет, когда, как управлять обратным вызовом.

+0

Параметр 'add' сценарий должен повторить что-то. – Barmar

+2

'rotl' не является асинхронным. – Barmar

+0

Я искал в google много статей об этом, и я обнаружил, что некоторые из них говорят об асинхронном cURL. Например, на этой странице они говорят об этом: http://php.net/manual/pt_BR/function.curl-setopt.php –

ответ

8

Может быть, посмотрите на это: https://gist.github.com/Xeoncross/2362936

Запрос:

class Requests 
{ 
    public $handle; 

    public function __construct() 
    { 
     $this->handle = curl_multi_init(); 
    } 

    public function process($urls, $callback) 
    { 
     foreach ($urls as $url) { 
      $ch = curl_init($url); 
      curl_setopt_array($ch, array(CURLOPT_RETURNTRANSFER => TRUE)); 
      curl_multi_add_handle($this->handle, $ch); 
     } 

     do { 
      $mrc = curl_multi_exec($this->handle, $active); 

      if ($state = curl_multi_info_read($this->handle)) { 
       //print_r($state); 
       $info = curl_getinfo($state['handle']); 
       //print_r($info); 
       $callback(curl_multi_getcontent($state['handle']), $info); 
       curl_multi_remove_handle($this->handle, $state['handle']); 
      } 

      usleep(10000); // stop wasting CPU cycles and rest for a couple ms 

     } while ($mrc == CURLM_CALL_MULTI_PERFORM || $active); 

    } 

    public function __destruct() 
    { 
     curl_multi_close($this->handle); 
    } 
} 
+0

Спасибо за обмен, кажется полезным, я обязательно попробую это. Он также работает с cron-системой? –

+0

Несомненно, я не видел бы причины, почему бы и нет. – Beachhouse

Смежные вопросы