我们的项目需要从多个不同的数据源收集信息,每个数据源都提供了一个rest api。最初,我们使用同步的方式进行请求,代码如下:
<code class="php">$data = [];<br>foreach ($apis as $api) {</p><pre class="brush:php;toolbar:false;"><code>$response = file_get_contents($api); //同步请求
$data[] = json_decode($response, true);</code>}
// 处理 $data
这种方法简单直接,但效率极低。每个API请求都需要等待响应完成才能发出下一个请求,如果某个API响应缓慢或出现错误,整个程序都会被阻塞。面对数十个甚至数百个API请求,程序的响应时间将变得无法接受。
为了解决这个问题,我们决定使用异步操作。经过调研,我们选择了 Guzzle HTTP 客户端,并利用其强大的 Promises 功能来实现异步请求。首先,使用 Composer 安装 Guzzle Promises 库:
<code class="bash">composer require guzzlehttp/promises</code>
然后,我们修改代码,使用 Guzzle Promises 来发送异步请求:
<code class="php">use GuzzleHttp\Client;<br>use GuzzleHttp\Promise;</p><p>$client = new Client();<br>$promises = [];<br>foreach ($apis as $api) {</p><pre class="brush:php;toolbar:false;"><code>$promises[] = $client->getAsync($api)->then(function ($response) {
return json_decode($response->getBody(), true);
});</code>}
$results = Promise\Utils::all($promises)->wait(); // 等待所有请求完成
// 处理 $results
这段代码的核心在于 $client->getAsync($api),它会异步地发送 GET 请求。then() 方法用于处理请求的成功响应,将响应体解析为 JSON 数据。Promise\Utils::all($promises) 将所有 Promise 组合在一起,只有所有请求都完成之后才会返回结果。wait() 方法会阻塞程序,直到所有异步操作完成。
与同步方法相比,异步方法的优势显而易见:
实际应用效果非常显著。在处理相同数量的API请求时,异步方法的处理时间比同步方法缩短了近 80%。用户体验得到了极大的提升,程序的响应速度也变得非常快。
总结来说,使用 Composer 和 Guzzle Promises 库来处理异步操作,不仅提高了程序效率,也提升了代码的可维护性和可读性。对于需要处理大量异步操作的项目,强烈推荐使用这种方法。
以上就是告别字符串处理噩梦:使用 Composer 和 Guzzle Promises 提升异步操作效率的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号