最近在维护一个需要频繁调用第三方 API 的 PHP 项目时,我遇到了一个让人头疼的问题。为了获取用户数据,程序需要向多个不同的服务发起请求,而且这些请求往往耗时较长。传统的做法是顺序执行这些请求:
<pre class="brush:php;toolbar:false;">// 伪代码:同步执行多个耗时操作 $data1 = fetch_from_api_1(); // 等待这里完成 $data2 = fetch_from_api_2(); // 再等待这里完成 $data3 = fetch_from_api_3(); // 继续等待... process_data($data1, $data2, $data3);
这种模式的弊端显而易见:整个程序会“卡”在每一个
fetch_from_api_x()
正当我一筹莫展之际,我发现了
guzzlehttp/promises
Composer在线学习地址:学习地址
在
guzzlehttp/promises
要使用
guzzlehttp/promises
立即学习“PHP免费学习笔记(深入)”;
<pre class="brush:php;toolbar:false;">composer require guzzlehttp/promises
安装完成后,你就可以在代码中开始使用 Promise 了。
guzzlehttp/promises
then()
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise;
$promise = new Promise();
$promise->then(
function ($value) {
echo 'Promise 成功完成,值为: ' . $value . PHP_EOL;
},
function ($reason) {
echo 'Promise 被拒绝,原因为: ' . $reason . PHP_EOL;
}
);
// 模拟异步操作完成
// 假设这里是某个耗时操作完成后,我们手动解决 Promise
$promise->resolve('这是异步操作的结果');
// 输出:Promise 成功完成,值为: 这是异步操作的结果在这个例子中,
$promise->resolve('...')onFulfilled
guzzlehttp/promises
then()
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise;
$promise = new Promise();
$promise
->then(function ($value) {
echo '第一步完成,接收到: ' . $value . PHP_EOL;
// 返回一个新值,传递给下一个 then
return $value . ' + 第二步处理';
})
->then(function ($value) {
echo '第二步完成,接收到: ' . $value . PHP_EOL;
// 甚至可以返回另一个 Promise,实现 Promise 转发
$anotherPromise = new Promise();
// 模拟另一个异步操作
// $anotherPromise->resolve('来自另一个 Promise 的结果');
return $anotherPromise;
})
->then(function ($value) {
echo '最终结果: ' . $value . PHP_EOL;
});
// 启动第一个 Promise
$promise->resolve('初始数据');
// 假设在某个时间点,第二个 Promise 也完成了
// 如果不调用,第三个 then 不会执行
// $anotherPromise->resolve('来自另一个 Promise 的结果');更棒的是,
guzzlehttp/promises
虽然 Promise 的核心是异步,但在某些场景下,你可能需要强制等待异步操作完成并获取其结果。
guzzlehttp/promises
wait()
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise;
$promise = new Promise(function () use (&$promise) {
// 这是一个会在 wait() 被调用时执行的函数,用于解析 Promise
sleep(1); // 模拟耗时操作
$promise->resolve('等待结束,结果已返回');
});
echo '程序继续执行其他任务...' . PHP_EOL;
$result = $promise->wait(); // 这里会阻塞,直到 Promise 完成
echo '获取到结果: ' . $result . PHP_EOL;
// 输出:
// 程序继续执行其他任务...
// 获取到结果: 等待结束,结果已返回 (等待了1秒)你还可以通过
cancel()
Promise 提供了一致的错误处理机制。当 Promise 被
reject()
onFulfilled
onRejected
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise;
use Exception;
$promise = new Promise();
$promise
->then(function ($value) {
throw new Exception('第一步出错啦!'); // 抛出异常
})
->then(null, function ($reason) { // 第二个 then 的 onRejected 回调
echo '捕获到错误: ' . $reason->getMessage() . PHP_EOL;
return '错误已被处理'; // 返回一个值,将链条从拒绝状态转为解决状态
})
->then(function ($value) {
echo '错误处理后继续: ' . $value . PHP_EOL;
});
$promise->resolve('开始');
// 输出:
// 捕获到错误: 第一步出错啦!
// 错误处理后继续: 错误已被处理guzzlehttp/promises
try-catch
在实际应用中,
guzzlehttp/promises
通过引入
guzzlehttp/promises
以上就是告别回调地狱与阻塞等待:如何使用GuzzlePromises优雅管理PHP异步操作的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号