2022-06-28 10:58:45
使用guzzlehttp/promises处理并发任务的核心步骤如下:
安装与引入库通过Composer安装库:
composer require guzzlehttp/promises在PHP文件中引入核心类:
use GuzzleHttpPromisePromise;use GuzzleHttpPromiseUtils;定义异步操作并返回Promise对象为每个耗时任务(如HTTP请求、数据库操作)创建独立的Promise,通过resolve()或reject()标记操作结果。示例:模拟异步支付请求
function makeAsyncPaymentRequest($order): Promise { $promise = new Promise(); 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;}关键点:
Promise对象封装异步操作,通过resolve()标记成功,reject()标记失败。
实际场景中,可替换为Guzzle HTTP客户端的异步请求(如GuzzleHttpClient::sendAsync())。
并发启动所有异步任务同时触发所有Promise,避免顺序阻塞。示例:启动四个并发任务
$order = (object)['id' => 123, 'amount' => 100];$paymentPromise = makeAsyncPaymentRequest($order);$stockPromise = makeAsyncStockUpdate($order);$emailPromise = makeAsyncEmailSend($order);$logisticsPromise = makeAsyncLogisticsNotify($order);使用Utils::all()等待所有Promise完成通过Utils::all()合并多个Promise,返回一个新Promise,所有子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(); // 同步阻塞等待结春橡果(可选)关键点:
then()注册成功/失败回调,支持链式调用(如.then(...).then(...))。
wait()用于同步阻塞场景,实际异步流程中可省略。
错误处理与链式调用
统一错误处理液基:通过then(null, $onRejected)或catch()(需结合otherwise())集中捕获错误。
链式操作:每个then()返回新Promise,可继续附加后续逻辑。示例:链式调用与错误处理
makeAsyncPaymentRequest($order) ->then( function ($paymentResult) { return makeAsyncStockUpdate($order); // 支付成功后更新库存 }, function ($reason) { return Promiserejection_for("支付阶段失败: " . $reason); } ) ->then( function ($stockResult) { echo "库存更新成功!"; }, function ($reason) { echo "库存更新失败: " . $reason; } );核心优势与适用场景
实际应用建议
通过guzzlehttp/promises,PHP开发者能以结构化方式高效处理异步任务,显著提升应用性能与代码质量。