PHP асинхронный cURL с обратным вызовом

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

Когда я пишу в своем браузере этот URL: Http: //www.myhost: 3049 / exemplo / индекс / асинхронный / он выполняет функцию 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, чтобы выполнить действие, которое СЕЙЧАС находится в том же классе, что и другие функции, только для тестирования. Это действие addAction, которое просто возвращает строку с сообщением «CALLBACK».

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

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

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);
}
}
9

Другие решения

Других решений пока нет …