2014-09-25 7 views
6

Sto tentando di eseguire una richiesta utilizzando cURL in modo asincrono con callback. Sto usando un pezzo di codice che copio da un sito.PHP cURL asincrono con callback

Quando scrivo nel mio browser questo URL: http://www.myhost:3049/exemplo/index/async/ esegue la funzione asyncAction che esegue la funzione 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/"); 
} 

Poi il ricciolo eseguire cURL per l'URL di eseguire un'azione che ormai è nella stessa classe che gli altri funzionano, solo per il test. Questa azione è addAction, che restituisce solo una stringa con il messaggio "CALLBACK".

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

Il risultato $ sta tornando semplicemente falsa. Forse il problema è che sto richiedendo di provare a eseguire un'azione che si trova nella stessa classe della funzione cURL. Ma comunque, come posso ottenere il messaggio di errore. Esiste una soluzione migliore, testata e con una buona spiegazione sull'uso asincrono con callback? Perché le cose che leggo non sono ben spiegate e inoltre non spiega quando, come gestire la cosa del callback.

+0

Il 'add' script deve eco qualcosa. – Barmar

+2

'arricciato' non è asincrono. – Barmar

+0

ho cercato in google molti articoli su di esso e ho trovato alcuni di loro parlare di cURL asincrona. Per esempio in questa pagina stanno parlando di questo: http://php.net/manual/pt_BR/function.curl-setopt.php –

risposta

8

Forse un'occhiata a questo: https://gist.github.com/Xeoncross/2362936

Richiesta:

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

Grazie per la condivisione mi sembra utile, lo cercherò sicuramente. Funziona anche con il sistema cron? –

+0

Certo, non vedrei una ragione per cui non lo farebbe. – Beachhouse