2014-09-25 36 views
6

Geri arama ile cURL kullanarak bir eşzamansız şekilde bir istek yapmaya çalışıyorum. Bir siteden kopyaladığım bir kod parçası kullanıyorum.Geri çağırma ile PHP eşzamansız cURL

Tarayıcımda bu url'yi yazdığımda: http://www.myhost:3049/exemplo/index/async/, curl_post işlevini yürüten asyncAction işlevini yürütün.

/** 
* 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/"); 
} 

Sonra cURL YAPIN sadece test için, diğerleri işlev aynı sınıfta bir işlem yapmaya bu URL'ye cURL yürütün. Bu eylem, "CALLBACK" iletisiyle birlikte bir dize döndüren addAction'dır.

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

$ sonuç yanlıştır. Belki de sorun şu ki, cURL işlevinin aynı sınıftaki bir eylemi yürütmeyi denemeyi talep ediyorum. Ama yine de, hata mesajını nasıl alabilirim. Daha iyi bir çözüm var mı, test edildi ve geri çağırma ile asenkronize kullanım hakkında iyi bir açıklama var mı? Çünkü okuduğum şeyler iyi açıklanmadı ve ne zaman, geri çağırma olayının nasıl yönetileceğini açıklamıyor.

+0

'add' komut şey yankı zorundadır. – Barmar

+2

'curl', zaman uyumsuz değildir. – Barmar

+0

Bu konuda google birçok makalede arama yaptım ve bazılarını asenkron CURL hakkında konuştuk. Örneğin bu sayfada bunlar hakkında konuşuyorlar: http://php.net/manual/pt_BR/function.curl-setopt.php –

cevap

8

Belki bu bir göz atın: https://gist.github.com/Xeoncross/2362936

İstek:

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

Paylaşımın yararlı olduğunu düşündüğünüz için teşekkür ederim, bunu deneyeceğim .. Ayrıca cron sistemi ile çalışıyor mu? –

+0

Elbette, bunun bir sebebi olmazdı. – Beachhouse