最近在开发一个处理用户提交数据的程序时,遇到了一个棘手的问题:用户输入的文本中包含各种非ASCII字符,例如中文、日文、特殊符号等等。这些字符导致程序在处理字符串时效率低下,甚至出现错误。为了解决这个问题,我尝试了多种方法,最终找到了voku/portable-ascii这个库。 Composer在线学习地址:学习地址
在现代web开发中,php应用常常需要与外部服务进行交互,例如调用第三方api、查询远程数据库、发送邮件或处理文件上传。这些操作通常是i/o密集型的,意味着它们需要等待外部系统响应,而在这个等待过程中,你的php脚本会暂停执行,直到结果返回。
想象一下这样一个场景:你的一个页面需要同时从三个不同的微服务获取数据,每个服务响应时间是200毫秒。如果采用传统的同步方式,你的脚本将顺序执行这三个请求,总耗时至少是
200ms + 200ms + 200ms = 600ms
我曾经为此头疼不已。为了提高效率,我尝试过直接使用
curl_multi
curl_multi
好消息是,PHP生态系统也在不断进化,为我们带来了解决这类问题的现代工具。其中,Composer 作为 PHP 的包管理器,让引入这些高级库变得轻而易举。而今天我们要介绍的 guzzlehttp/promises
guzzlehttp/promises
立即学习“PHP免费学习笔记(深入)”;
通过 Composer 安装
guzzlehttp/promises
<pre class="brush:php;toolbar:false;">composer require guzzlehttp/promises
这会将库添加到你的项目中,并自动处理所有依赖。
then()
resolve()
reject()
一个
Promise
pending
fulfilled
rejected
then()
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise; $promise = new Promise(); // 注册成功和失败的回调 $promise->then( function ($value) { echo "操作成功,得到值: " . $value . PHP_EOL; }, function ($reason) { echo "操作失败,原因: " . $reason . PHP_EOL; } ); // 模拟异步操作完成,兑现 Promise $promise->resolve('这是异步操作的结果!'); // 输出: 操作成功,得到值: 这是异步操作的结果! $anotherPromise = new Promise(); $anotherPromise->then(null, function ($reason) { echo "另一个操作失败,原因: " . $reason . PHP_EOL; }); // 模拟异步操作失败,拒绝 Promise $anotherPromise->reject('网络连接超时!'); // 输出: 另一个操作失败,原因: 网络连接超时!
这里的关键是,
resolve()
reject()
then()
guzzlehttp/promises
then()
then()
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise; $firstPromise = new Promise(); $secondPromise = new Promise(); $firstPromise ->then(function ($value) use ($secondPromise) { echo "第一步完成,得到: " . $value . PHP_EOL; // 返回第二个 Promise,后续链条会等待它完成 return $secondPromise; }) ->then(function ($value) { echo "第二步完成,得到: " . $value . PHP_EOL; }); $firstPromise->resolve('用户ID'); // 触发第一步 // 输出: 第一步完成,得到: 用户ID // 假设第二个异步操作在稍后完成 $secondPromise->resolve('用户详细信息'); // 触发第二步 // 输出: 第二步完成,得到: 用户详细信息
通过这种方式,你可以将复杂的异步工作流分解成可管理的小块,代码逻辑清晰,易于理解。
wait()
尽管 Promise 旨在处理异步,但在某些场景下,你可能需要在脚本的某个点强制等待所有异步操作完成并获取最终结果,例如在命令行脚本结束前。
wait()
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise; $dataFetchPromise = new Promise(function () use (&$dataFetchPromise) { // 模拟一个耗时操作 sleep(2); // 模拟2秒的异步操作 $dataFetchPromise->resolve('从数据库获取的数据'); }); echo "开始等待..." . PHP_EOL; $result = $dataFetchPromise->wait(); // 脚本会在这里阻塞,直到 Promise 完成 echo "等待结束,结果: " . $result . PHP_EOL; // 输出: // 开始等待... // (暂停2秒) // 等待结束,结果: 从数据库获取的数据
wait()
false
Utils::all()
guzzlehttp/promises
GuzzleHttp\Promise\Utils::all()
<pre class="brush:php;toolbar:false;">use GuzzleHttp\Promise\Promise; use GuzzleHttp\Promise\Utils; $promise1 = new Promise(function () use (&$promise1) { sleep(1); $promise1->resolve('结果A'); }); $promise2 = new Promise(function () use (&$promise2) { sleep(2); $promise2->resolve('结果B'); }); $promise3 = new Promise(function () use (&$promise3) { sleep(0.5); $promise3->resolve('结果C'); }); echo "开始并发等待所有 Promise..." . PHP_EOL; $allResults = Utils::all([$promise1, $promise2, $promise3])->wait(); print_r($allResults); // 脚本会等待最慢的 Promise (promise2) 完成,总耗时约2秒。 // 输出: // 开始并发等待所有 Promise... // (暂停2秒) // Array // ( // [0] => 结果A // [1] => 结果B // [2] => 结果C // )
onRejected
guzzlehttp/promises
then()
在现代 PHP 开发中,处理异步操作已不再是可选项,而是构建高性能、高响应度应用的关键。
guzzlehttp/promises
以上就是告别阻塞等待:使用Composer和GuzzlePromises玩转PHP异步编程的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号