【问题标题】:Non-blocking calls in PHP with GuzzleHttp REST API client使用 GuzzleHttp REST API 客户端在 PHP 中进行非阻塞调用
【发布时间】:2015-06-14 21:10:25
【问题描述】:

我想使用 PHP 库 GuzzleHttp 进行非阻塞 REST API 调用。

  1. 我有一个 REST API 服务器 (http://api.example.com/v1/wait)
  2. wait 方法不做任何事情,除了 sleep(10)
  3. 我正在使用future 参数从 PHP CLI 运行以下命令:
$client = new \GuzzleHttp\Client;
$response = $client->get('http://api.example.com/v1/wait', [
    'future' => true,
    'body' => [
        'some' => 'var'
    ],
]);
echo 'OK';

我希望“OK”会立即回显,而无需等待 REST API 调用完成。相反,执行会暂停 10 秒 - 这是 REST wait() 方法中的 sleep() 持续时间。

根据 Guzzle 文档:

你可以通过将future request选项设置为true来发送异步请求

我对调用完成回调不感兴趣,我只想给 API 一些(可能是缓慢的)任务来处理并继续生活。

我也尝试过 cURL 自己的多请求,其他几个库 - 结果是一样的。执行被阻塞,等待来自 API 服务器的响应。

那么,可能是什么问题?

谢谢!

【问题讨论】:

    标签: php api rest guzzle


    【解决方案1】:

    即使使用cURL 原生“多线程”,最大执行时间也将是完成最长查询所需的时间,因此PHP 将等待最新的查询反正。这里的非阻塞术语是当前脚本的术语(例如一次 5 个非阻塞请求,但它们都将在此脚本中完成)。换句话说,除非所有请求都至少报告 smth,否则脚本不会离开它们。

    可能的解决方案是pcntl_fork初始化一些单独的线程 以完成您的任务而无需等待完成。由于不受控制的分叉,存在所谓的僵尸进程,但你可以在你的情况下尝试一下,bec。它不是永远运行的进程(aka worker)。

    这是one of the many关于pcntl_fork方法的文章。

    【讨论】:

    • 是的,看起来是这样的。除了使用 pcntl_fork 之外,没有其他方法可以实现它。我在 Guzzle 的析构函数中找到了这个: public function __destruct() { // 在终止脚本之前完成所有打开的连接。 if ($this->handles) { $this->execute(); } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2011-10-15
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    相关资源
    最近更新 更多