我想使用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文章.