php 異步並行後續--兼容FPM使用的組件

上次給人推薦了這篇文章,關於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模式下效果一樣的.

如圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章