我想使用PHP库GuzzleHttp。
进行非阻塞REST API调用http://api.example.com/v1/wait
)wait
。之外,sleep(10)
方法不执行任何操作
future
param:$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服务器到达的响应。
那么,可能是什么问题?
谢谢!
答案 0 :(得分:4)
即使使用cURL
本机“多线程”,最长执行时间也是完成最长查询所需的时间,因此 PHP将等待最新查询无论如何。这里的非阻塞术语是当前脚本(一次用于5个非阻塞请求,但它们都将根据此脚本完成)。换句话说,除非所有请求至少报告smth,否则脚本不会离开它们。
可能的解决方案是pcntl_fork
初始化一些单独的线程以完成您的任务而无需等待完成。由于不受控制的分叉,有所谓的僵尸进程,但你可以试试你的情况,因为。它不是永远在运行的过程( aka worker )。
以下是关于pcntl_fork
方法的one of the many篇文章。