php 非同步並行後續--相容FPM使用的元件

李照耀發表於2024-05-19

上次給人推薦了這篇文章,關於PHP非同步並行的文章,之後有人評論問這個元件能不能給fpm用,我測試了一下發現不行,於是又找到一個可以給fpm用的http請求元件.

安裝很簡單,就這樣 composer require guzzlehttp/guzzle 進行安裝一下.

然後程式碼示例如下:

我們先建一個檔案作為一個長時間耗時的api介面,檔名api.php,程式碼如下:

<?php
sleep(1);
$act = isset($_GET['act']) ? $_GET['act'] : "";
echo date('Y-m-d H:i:s', time()) . " act: " . $act;
exit;

這裡我們讓它睡眠1秒鐘,然後輸出當前時間.

然後建立一個請求的檔案 index.php,程式碼如下:

<?php
include "vendor/autoload.php";
use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$start = microtime(true);

$client = new Client(['verify' => false]);
$promise = [];
$list = [];
foreach (range(1, 10) as $item) {
    $url = "http://local.async.com/api.php?act=" . $item;
    $promise[$item] = $client->postAsync($url, []);
}
$response = Promise\Utils::unwrap($promise);
foreach ($response as $key => $value) {
    $list[] = (string)($value->getBody());
}

$end = microtime(true);
echo (($end - $start) * 1000) . " ms<br/>";
echo "<pre>";
var_dump($list);
echo "</pre>";

這裡我們還是讓他發起10個請求,然後將結果放入到list陣列裡面儲存,最後看看效果,

我們看到時間上只用了3秒鐘左右,然後act的引數都有,說明請求確實到位了,然後這10個元素的請求結果時間並不是按照先後順序執行的,是並行的,說明確實請求並行了,這樣一來,在那種大資料量需要呼叫介面請求的時候就派上用場了.

當然了,我這是在nginx+fpm模式下的測試結果,在cli模式下效果一樣的.

如圖:

相關文章