Я пытаюсь сделать запрос с использованием cURL асинхронным способом с обратным вызовом. Я использую кусок кода, который я копирую с сайта.
Когда я пишу в своем браузере этот url: http: //www.myhost: 3049 / instanceplo / 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 выполняет cURL для этого URL-адреса для выполнения действия, которое NOW находится в том же классе, что и остальные функции, только для тестирования. Это действие addAction, которое просто возвращает строку с сообщением «CALLBACK».
function addAction() { sleep(15); return "CALLBACK"; }
Результат $ возвращает только false. Возможно, проблема в том, что я прошу выполнить попытку выполнить действие, которое находится в том же классе, что и функция cURL. Но в любом случае, как я могу получить сообщение об ошибке. Есть ли лучшее решение, проверено и с хорошим объяснением об использовании в качестве асинхронного с обратным вызовом? Потому что то, что я читаю, не очень хорошо объяснено, а также не объясняет, когда, как управлять обратным вызовом.
Возможно, взгляните на это: 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); } }