我們的項目需要從多個不同的數據源收集信息,每個數據源都提供了一個rest api。最初,我們使用同步的方式進行請求,代碼如下:
$data = [];<br>foreach ($apis as $api) {</p><pre class="brush:php;toolbar:false">$response = file_get_contents($api); //同步請求 $data[] = json_decode($response, true);
}
// 處理 $data
這種方法簡單直接,但效率極低。每個API請求都需要等待響應完成才能發出下一個請求,如果某個API響應緩慢或出現錯誤,整個程序都會被阻塞。面對數十個甚至數百個API請求,程序的響應時間將變得無法接受。
為了解決這個問題,我們決定使用異步操作。經過調研,我們選擇了 Guzzle http 客戶端,并利用其強大的 promises 功能來實現異步請求。首先,使用 composer 安裝 Guzzle Promises 庫:
composer require guzzlehttp/promises
然后,我們修改代碼,使用 Guzzle Promises 來發送異步請求:
use GuzzleHttpClient;<br>use GuzzleHttpPromise;</p><p>$client = new Client();<br>$promises = [];<br>foreach ($apis as $api) {</p><pre class="brush:php;toolbar:false">$promises[] = $client->getAsync($api)->then(function ($response) { return json_decode($response->getBody(), true); });
}
$results = PromiseUtils::all($promises)->wait(); // 等待所有請求完成
// 處理 $results
這段代碼的核心在于 $client->getAsync($api),它會異步地發送 GET 請求。then() 方法用于處理請求的成功響應,將響應體解析為 JSON 數據。PromiseUtils::all($promises) 將所有 Promise 組合在一起,只有所有請求都完成之后才會返回結果。wait() 方法會阻塞程序,直到所有異步操作完成。
與同步方法相比,異步方法的優勢顯而易見:
實際應用效果非常顯著。在處理相同數量的API請求時,異步方法的處理時間比同步方法縮短了近 80%。用戶體驗得到了極大的提升,程序的響應速度也變得非常快。
總結來說,使用 Composer 和 Guzzle Promises 庫來處理異步操作,不僅提高了程序效率,也提升了代碼的可維護性和可讀性。對于需要處理大量異步操作的項目,強烈推薦使用這種方法。