PHP 中使用 GuzzleHttp REST API 客户端的非阻塞调用
Non-blocking calls in PHP with GuzzleHttp REST API client
我想使用 PHP 库 GuzzleHttp 进行非阻塞 REST API 调用。
- 我有一个 REST API 服务器 (
http://api.example.com/v1/wait
)
wait
方法不做任何事情,除了 sleep(10)
.
- 我是 运行 来自 PHP CLI 的
future
参数:
$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
本机 "multithreading",最大执行时间也将是 完成最长查询所需的时间 ,因此 PHP 无论如何都会等待最新的查询。这里的非阻塞术语是在当前脚本术语中(例如一次5个非阻塞请求,但它们都将在本脚本术语中完成)。换句话说,脚本不会离开它们,除非所有请求至少报告 smth.
可能的解决方案是 pcntl_fork
启动一些单独的线程 来完成您的任务 而无需等待它 完成。由于不受控制的分叉,有所谓的僵尸进程,但是你可以在你的情况下试一试,因为。它不是永远的-运行 过程(又名工人)。
这里有 one of the many 篇关于 pcntl_fork
方法的文章。
我想使用 PHP 库 GuzzleHttp 进行非阻塞 REST API 调用。
- 我有一个 REST API 服务器 (
http://api.example.com/v1/wait
) wait
方法不做任何事情,除了sleep(10)
.- 我是 运行 来自 PHP CLI 的
future
参数:
$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
本机 "multithreading",最大执行时间也将是 完成最长查询所需的时间 ,因此 PHP 无论如何都会等待最新的查询。这里的非阻塞术语是在当前脚本术语中(例如一次5个非阻塞请求,但它们都将在本脚本术语中完成)。换句话说,脚本不会离开它们,除非所有请求至少报告 smth.
可能的解决方案是 pcntl_fork
启动一些单独的线程 来完成您的任务 而无需等待它 完成。由于不受控制的分叉,有所谓的僵尸进程,但是你可以在你的情况下试一试,因为。它不是永远的-运行 过程(又名工人)。
这里有 one of the many 篇关于 pcntl_fork
方法的文章。