在處理需要遠程接口調用的大量數據時,我們面臨一個關鍵問題:串行處理導致的效率低下。如果每個接口調用需要1秒,那么即使是10條數據,也需要10秒來完成,這還沒有考慮到網絡延遲和接口提供方可能出現的問題。在串行執行的情況下,一旦接口調用遇到問題,整個處理時間會成倍增加,這不僅降低了程序的響應速度,也增加了系統的不穩定性。
為了解決這個問題,我們可以采取以下幾種優化策略:
假設第三方或者遠程接口調用偽代碼如下:
<?phppublic function sync(): /support/Response{ sleep(1); return json(['data' => date('Y-m-d H:i:s')]);}
接口調用訪問地址:http://127.0.0.1:8888/index/sync
假設業務系統調用偽代碼:
<?phpdeclare(strict_types=1);foreach (range(1, 10) as $key) { $list[] = file_get_contents("http://127.0.0.1:8888/index/sync");}print_r($list);
調用輸出:
[x] [系統調用耗時時間] 10.138074159622Array( [0] => {"data":"2024-05-16 22:38:00"} [1] => {"data":"2024-05-16 22:38:01"} [2] => {"data":"2024-05-16 22:38:02"} [3] => {"data":"2024-05-16 22:38:03"} [4] => {"data":"2024-05-16 22:38:04"} [5] => {"data":"2024-05-16 22:38:05"} [6] => {"data":"2024-05-16 22:38:06"} [7] => {"data":"2024-05-16 22:38:07"} [8] => {"data":"2024-05-16 22:38:08"} [9] => {"data":"2024-05-16 22:38:09"})
可以看出上面是按順序調用接口,總共耗時10.14秒。
這個庫提供了一個小而簡單的PHP PCNTL擴展的包裝器。它允許并行運行不同的進程,并具有易于使用的API。官方地址:https://github.com/spatie/async
您可以通過composer安裝該軟件包:
composer require spatie/async
注意:該擴展庫異步并行執行需要所需的擴展pcntl 和 posix。沒有安裝在您當前的PHP運行時中, Pool 將自動回退到同步執行任務。
Pool類有一個靜態方法 isSupported,你可以調用它來檢查你的平臺是否能夠運行異步進程。
require '../vendor/autoload.php';use Spatie/Async/Pool;var_dump(Pool::isSupported());
支持異步進程則打印true,否則為false。
<?php/** * @author Tinywan(ShaoBo Wan) * @date 2024/5/21 14:00 */declare(strict_types=1);require '../vendor/autoload.php';use Spatie/Async/Pool;$timeOne = microtime(true);$pool = Pool::create();foreach (range(1, 10) as $item) { $pool[] = async(function () use ($item) { return file_get_contents("http://127.0.0.1:8888/index/sync"); })->then(function (string $output) use (&$list) { // Handle success $list[] = $output; })->catch(function (Throwable $exception) { // Handle exception echo '[x] [異常] ' . $exception->getMessage() . PHP_EOL; });}await($pool);$timeTwo = microtime(true);echo '[x] [系統調用耗時時間] ' . ($timeTwo - $timeOne) . PHP_EOL,print_r($list);
調用輸出:
[x] [系統調用耗時時間] 4.3443310260773Array( [0] => {"data":"2024-05-16 22:53:47"} [1] => {"data":"2024-05-16 22:53:47"} [2] => {"data":"2024-05-16 22:53:47"} [3] => {"data":"2024-05-16 22:53:47"} [4] => {"data":"2024-05-16 22:53:47"} [5] => {"data":"2024-05-16 22:53:47"} [6] => {"data":"2024-05-16 22:53:47"} [7] => {"data":"2024-05-16 22:53:47"} [8] => {"data":"2024-05-16 22:53:48"} [9] => {"data":"2024-05-16 22:53:49"})
可以看出上面是按并行調用接口,總共耗時4.34秒。節省了差不多一半多時間。
本文鏈接:http://www.tebozhan.com/showinfo-26-88934-0.html誰說PHP不能異步和并行運行?
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 聊聊樂觀鎖與悲觀鎖