最近,我在开发一个电商平台时,遇到了一个典型的性能瓶颈。用户下单后,系统需要同时完成几件事:向支付网关发起请求、更新库存、发送订单确认邮件,以及通知物流系统。如果我按照传统的同步方式依次执行这些操作,整个下单流程可能会耗时数秒,这对于用户体验来说是不可接受的。
最初,我尝试过最直接的顺序调用:
<pre class="brush:php;toolbar:false;">// 伪代码:传统阻塞式调用 $paymentResult = makePaymentRequest($order); // 等待支付网关响应 $stockUpdateResult = updateStock($order); // 等待库存更新完成 $emailSendResult = sendOrderConfirmationEmail($order); // 等待邮件发送 $logisticsResult = notifyLogistics($order); // 等待物流通知
这种方式的缺点显而易见:总耗时是所有操作耗时之和。如果其中任何一个环节出现网络延迟,整个系统都会被拖慢。
为了提升性能,我考虑过使用
curl_multi
guzzlehttp/promises
正当我一筹莫展时,我发现了
guzzlehttp/promises
立即学习“PHP免费学习笔记(深入)”;
使用Composer安装
guzzlehttp/promises
<pre class="brush:php;toolbar:false;">composer require guzzlehttp/promises
安装完成后,我们就可以开始使用它来重构之前的下单流程了。
guzzlehttp/promises
Promise
then()
then()
onFulfilled
onRejected
then()
让我们看看如何使用它来优化下单流程:
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise;
use GuzzleHttp\Promise\Utils;
// 模拟异步操作,返回一个Promise
function makeAsyncPaymentRequest($order): Promise
{
$promise = new Promise();
// 假设这是一个耗时的操作,比如调用Guzzle HTTP客户端发送请求
// 实际应用中,这里会发起真正的异步请求,并在请求完成后resolve或reject
go(function () use ($promise, $order) { // 假设go是一个非阻塞的协程/异步函数
sleep(1); // 模拟网络延迟
if (rand(0, 1)) {
$promise->resolve("支付成功,订单ID: " . $order->id);
} else {
$promise->reject("支付失败,订单ID: " . $order->id);
}
});
return $promise;
}
function makeAsyncStockUpdate($order): Promise
{
$promise = new Promise();
go(function () use ($promise, $order) {
sleep(0.5);
$promise->resolve("库存更新成功,订单ID: " . $order->id);
});
return $promise;
}
function makeAsyncEmailSend($order): Promise
{
$promise = new Promise();
go(function () use ($promise, $order) {
sleep(0.8);
$promise->resolve("邮件发送成功,订单ID: " . $order->id);
});
return $promise;
}
function makeAsyncLogisticsNotify($order): Promise
{
$promise = new Promise();
go(function () use ($promise, $order) {
sleep(0.7);
$promise->resolve("物流通知成功,订单ID: " . $order->id);
});
return $promise;
}
// 模拟订单对象
$order = (object)['id' => 123, 'amount' => 100];
// 同时发起所有异步操作
$paymentPromise = makeAsyncPaymentRequest($order);
$stockPromise = makeAsyncStockUpdate($order);
$emailPromise = makeAsyncEmailSend($order);
$logisticsPromise = makeAsyncLogisticsNotify($order);
// 使用Utils::all()等待所有Promise完成
Utils::all([
'payment' => $paymentPromise,
'stock' => $stockPromise,
'email' => $emailPromise,
'logistics' => $logisticsPromise,
])
->then(
function ($results) {
echo "所有操作均成功完成!\n";
print_r($results);
},
function ($reason) {
echo "有操作失败了!原因: " . $reason . "\n";
}
)
->wait(); // 同步等待所有Promise完成,直到所有异步任务都解决在这个例子中,我们为每个耗时操作创建了一个Promise,并使用
GuzzleHttp\Promise\Utils::all()
all()
guzzlehttp/promises
then().then()...
catch()
then(null, $onRejected)
onRejected
guzzlehttp/promises
wait()
cancel()
guzzlehttp/promises
guzzlehttp/promises
guzzlehttp/promises
以上就是PHP异步编程的救星:如何使用guzzlehttp/promises优雅地处理并发任务的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号