Composer在线学习地址:[学习地址](https://pan.quark.cn/s/371f7205c512]
最近在开发一个电商后台服务时,我遇到了一个典型的性能瓶颈。我们的系统需要在一个请求中,同时从用户服务获取用户信息、从商品服务获取商品详情、再从库存服务查询库存量,最终整合数据后返回。起初,我按照最直观的方式,一个接一个地调用这些内部 api。结果可想而知:每个 api 调用都需要几十到上百毫秒,三个服务加起来,一个请求的响应时间轻松突破300毫秒,高峰期甚至更高,用户体验极差。
我尝试过一些简单的优化,比如缓存,但对于实时性要求较高的场景,缓存并不是万能药。真正的痛点在于,这三个 API 调用之间并没有严格的先后依赖关系,它们可以“同时”进行。但在 PHP 的同步执行模型下,我们却不得不等待一个完成后再开始下一个。这就像去银行办三项业务,明明三个窗口都能办,你却非要在一个窗口排队办完一项再换下一个窗口,效率自然低下。
就在我为如何优化这些“伪并发”操作而苦恼时,我偶然接触到了
guzzlehttp/promises
guzzlehttp
guzzlehttp/promises
guzzlehttp/promises
首先,通过 Composer 轻松安装这个库:
立即学习“PHP免费学习笔记(深入)”;
<pre class="brush:php;toolbar:false;">composer require guzzlehttp/promises
现在,我们来看看如何用它来解决之前的多服务调用问题。假设我们有三个模拟的异步函数,它们会返回一个 Promise:
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise;
use GuzzleHttp\Promise\Utils;
function getUserInfoPromise(int $userId): Promise
{
return new Promise(function () use (&$promise, $userId) {
// 模拟网络延迟
sleep(1);
$promise->resolve(['id' => $userId, 'name' => '用户' . $userId]);
});
}
function getProductInfoPromise(int $productId): Promise
{
return new Promise(function () use (&$promise, $productId) {
// 模拟网络延迟
sleep(0.8);
$promise->resolve(['id' => $productId, 'title' => '商品' . $productId]);
});
}
function getStockInfoPromise(int $productId): Promise
{
return new Promise(function () use (&$promise, $productId) {
// 模拟网络延迟
sleep(0.5);
$promise->resolve(['productId' => $productId, 'stock' => rand(1, 100)]);
});
}
// 假设要获取的用户ID和商品ID
$userId = 123;
$productId = 456;
$startTime = microtime(true);
// 创建所有 Promise
$promises = [
'user' => getUserInfoPromise($userId),
'product' => getProductInfoPromise($productId),
'stock' => getStockInfoPromise($productId),
];
// 使用 Utils::all() 等待所有 Promise 完成
Utils::all($promises)->then(
function (array $results) use ($startTime) {
$endTime = microtime(true);
echo "所有数据获取完成,耗时:" . round($endTime - $startTime, 2) . "秒\n";
echo "用户信息: " . json_encode($results['user']) . "\n";
echo "商品信息: " . json_encode($results['product']) . "\n";
echo "库存信息: " . json_encode($results['stock']) . "\n";
},
function (Throwable $reason) use ($startTime) {
$endTime = microtime(true);
echo "数据获取失败,耗时:" . round($endTime - $startTime, 2) . "秒\n";
echo "错误原因: " . $reason->getMessage() . "\n";
}
)->wait(); // 强制同步等待所有 Promise 解决运行这段代码,你会发现总耗时不再是三个
sleep
sleep
guzzlehttp/promises
Utils::all()
then
guzzlehttp/promises
then()
then(null, $onRejected)
otherwise()
wait()
guzzlehttp/promises
在我的电商后台服务中,引入
guzzlehttp/promises
总而言之,
guzzlehttp/promises
guzzlehttp/promises
以上就是如何使用guzzlehttp/promises优雅地解决PHP中的异步操作与并发难题的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号