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