2014-09-25 16 views
6

Tôi đang cố thực hiện yêu cầu bằng cách sử dụng cURL theo cách không đồng bộ với gọi lại. Tôi đang sử dụng một đoạn mã mà tôi sao chép từ một trang web.PHP không đồng bộ cURL với gọi lại

Khi tôi viết trong trình duyệt của tôi url này: http://www.myhost:3049/exemplo/index/async/ thực thi hàm asyncAction thực thi hàm 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/"); 
} 

Sau đó, cURL thực thi cURL với URL đó để thực hiện tác vụ NOW trong cùng lớp mà chức năng khác thực hiện, chỉ để thử nghiệm. Hành động này là addAction, mà chỉ trả về một chuỗi với thông báo "CALLBACK".

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

Kết quả $ chỉ trả về sai. Có thể vấn đề là tôi đang yêu cầu thử thực hiện một hành động trong cùng một lớp với hàm cURL. Nhưng dù sao, làm thế nào tôi có thể nhận được thông báo lỗi. Có giải pháp nào tốt hơn, được thử nghiệm và giải thích tốt về việc sử dụng không đồng bộ với tính năng gọi lại không? Bởi vì những thứ tôi đọc không được giải thích rõ ràng và cũng không giải thích được khi nào, cách quản lý điều gọi lại.

+0

Lệnh 'add' kịch bản có echo một cái gì đó. – Barmar

+2

'curl' không phải là không đồng bộ. – Barmar

+0

tôi đã tìm kiếm trong google nhiều bài viết về nó và tôi thấy một số người trong số họ nói về cURL không đồng bộ. Ví dụ trong trang này họ đang nói về điều này: http://php.net/manual/pt_BR/function.curl-setopt.php –

Trả lời

8

Có lẽ hãy xem này: https://gist.github.com/Xeoncross/2362936

Yêu cầu:

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

Cảm ơn bạn đã chia sẻ có vẻ hữu ích, tôi chắc chắn sẽ thử điều này .. Liệu nó cũng làm việc với hệ thống cron? –

+0

Chắc chắn, tôi sẽ không thấy một lý do nó sẽ không. – Beachhouse

Các vấn đề liên quan