當前位置: 妍妍網 > 碼農

PHP如何並列異步處理HTTP請求

2024-05-19碼農

概述

在對接第三方介面時,有些介面可能會比較耗時,為了提高介面呼叫的效率,可以考慮使用異步請求。透過異步請求,可以在發起介面呼叫後立即返回結果,而不需要等待介面返回。

正常請求

<?php
/**
 * @desc go.php 描述資訊
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/5/18 18:08
 */
declare(strict_types=1);
$url = 'http://127.0.0.1:8888/index/sync';
$timeOne = microtime(true);
foreach (range(1, 100) as $key) {
$list[] = file_get_contents($url);
}
$timeTwo = microtime(true);
echo'[x] [系統呼叫耗時時間] ' . ($timeTwo - $timeOne) . PHP_EOL;

呼叫輸出,可以看出迴圈請求100次,總耗時: 37.23

[x] [系統呼叫耗時時間] 37.230930089951

並行請求

Guzzle是一個PHP的HTTP客戶端,用來輕而易舉地發送請求,並整合到我們的WEB服務上。

  • 介面簡單:構建查詢語句、POST請求、分流上傳下載大檔、使用HTTP cookies、上傳JSON數據等等。

  • 發送同步或異步的請求均使用相同的介面。

  • 使用PSR-7介面來請求、響應、分流,允許你使用其他相容的PSR-7類別庫與Guzzle共同開發。

  • 抽象了底層的HTTP傳輸,允許你改變環境以及其他的程式碼,如:對cURL與PHP的流或socket並非重度依賴,非阻塞事件迴圈。

  • 中介軟體系統允許你建立構成客戶端行為。

  • 這裏可以使用 Promise 和異步請求來同時發送多個請求。

    安裝

    compsoer require guzzlehttp/guzzle

    虛擬碼

    <?php
    /**
     * @desc go.php 
     * @author Tinywan(ShaoBo Wan)
     * @date 2024/5/18 18:08
     */

    declare(strict_types=1);
    require_once__DIR__ . '/../vendor/autoload.php';
    useGuzzleHttp\Client;
    useGuzzleHttp\Promise;
    $requestData = [
    'username' => '開源技術小棧',
    'age' => 24
    ];
    $url = 'http://127.0.0.1:8888/index/sync';
    $header = [
    'Authorization' => 'Bearer xxxxxxxxxxxx'
    ];
    $timeOne = microtime(true);
    $client = new Client(['verify' => false]);
    for ($i = 0; $i < 100; $i++) {
    $promises[$i] = $client->postAsync($url, ['headers' => $header, 'json' => $requestData]);
    }
    $responses = Promise\Utils::unwrap($promises);
    foreach ($responses as $key => $response) {
    echo'【響應狀態碼】 : ' . $response->getStatusCode() . "\n";
    }
    $timeTwo = microtime(true);
    echo'[x] [系統呼叫耗時時間] ' . ($timeTwo - $timeOne) . PHP_EOL;





    呼叫輸出,可以看出迴圈請求 100 次,總耗時: 10.41

    【響應狀態碼】 : 200
    ....
    【響應狀態碼】 : 200
    [x] [系統呼叫耗時時間] 10.412175893784

    更多了解guzzlephp官方文件: https://docs.guzzlephp.org/en/stable/quickstart.html