使用GuzzleHttp REST API客户端在PHP中进行非阻塞调用

时间:2015-04-09 13:15:49

标签: php api rest guzzle

我想使用PHP库GuzzleHttp。

进行非阻塞REST API调用
  1. 我有一个REST API服务器(http://api.example.com/v1/wait
  2. 除了wait。之外,
  3. sleep(10)方法不执行任何操作
  4. 我使用future param:
  5. 从PHP CLI运行以下命令
    $client = new \GuzzleHttp\Client;
    $response = $client->get('http://api.example.com/v1/wait', [
        'future' => true,
        'body' => [
            'some' => 'var'
        ],
    ]);
    echo 'OK';
    

    我期待"好的"会立即回显,而不必等待REST API调用的完成。相反,执行会暂停10秒 - 这是REST sleep()方法中的wait()持续时间。

    根据Guzzle文件:

      

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

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

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

    那么,可能是什么问题?

    谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

以下是关于pcntl_fork方法的one of the many篇文章。