【问题标题】:PHP asynchronous cURL with callback带回调的 PHP 异步 cURL
【发布时间】:2014-11-20 07:13:53
【问题描述】:

我正在尝试使用 cURL 以带有回调的异步方式发出请求。我正在使用从网站复制的一段代码。

当我在浏览器中写入这个 url:http://www.myhost:3049/exemplo/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";
}

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

【问题讨论】:

  • add 脚本必须回显某些内容。
  • curl 不是异步的。
  • 我在谷歌上搜索了很多关于它的文章,我发现其中一些在谈论异步 cURL。例如在这个页面中,他们正在谈论这个:php.net/manual/pt_BR/function.curl-setopt.php
  • 参见curl_multi_init(不是异步的,但可以并行运行多个请求)。对于异步,您必须使用 Gearman (gearman.org)。它可作为 php 扩展使用。不确定,如果这对你有帮助。
  • 您的代码不起作用,因为您设置了 4 秒超时,服务器休眠 15 秒。

标签: php curl asynchronous callback


【解决方案1】:

不妨看看这个: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);
    }
}

【讨论】:

  • 感谢分享似乎很有用,我一定会试试这个.. 它也适用于 cron 系统吗?
  • 当然,我看不出它不这样做的原因。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2013-09-12
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多