使用GuzzleHttp REST API客户端的PHP中的非阻塞调用

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

>我有一个REST API服务器(http://api.example.com/v1/wait)
> wait方法不执行任何操作,除了sleep(10)除外.
>我正在使用将来的参数从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文档:

You can send asynchronous requests by setting the future request option to true

我对调用完成回调并不感兴趣,我想要做的只是给API一些(可能很慢)的工作来继续生活.

我还尝试了cURL自己的multirequest和其他几个库-结果是相同的.执行被阻止,等待响应从API服务器到达.

那么,可能是什么问题呢?

谢谢!

解决方法:

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

可能的解决方法是pcntl_fork初始化一些单独的线程来完成您的任务,而无需等待它完成.由于存在无法控制的分叉,因此存在所谓的僵尸进程,但是您可以尝试一下,因为它是bec.它不是永远运行的进程(又称工作进程).

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

上一篇:PHP-如何在Guzzle中获取Request对象?


下一篇:php-如何使用guzzleHttp创建请求?