带有回调的PHP异步cURL

can*_*ayo 8 php curl asynchronous callback

我正在尝试使用cURL以异步方式使用回调来执行请求.我正在使用从网站复制的一段代码.

当我在浏览器中写这个url:http://www.myhost:3049/exemplo/index/async /它执行执行curl_post函数的函数asyncAction.

/** 
* 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/");
}
Run Code Online (Sandbox Code Playgroud)

然后cURL执行cURL到该URL以执行NOW与其他人运行的同一个类的操作,仅用于测试.这个动作是addAction,它只返回一个带有"CALLBACK"消息的字符串.

function addAction() {
    sleep(15);
    return "CALLBACK";
}
Run Code Online (Sandbox Code Playgroud)

$ result返回false.也许问题是我正在请求尝试执行与cURL函数属于同一类的操作.但无论如何,我怎么能得到错误信息.有没有更好的解决方案,经过测试,并且有关使用与回调异步的良好解释?因为我读到的东西没有得到很好的解释,也没有解释何时,如何管理回调的事情.

Bea*_*use 9

也许看看这个: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);
    }
}
Run Code Online (Sandbox Code Playgroud)