Swoole を使用して信頼性の高い非同期 HTTP クライアントをカプセル化する

PHPz
リリース: 2023-06-13 15:29:56
オリジナル
1698 人が閲覧しました

Web アプリケーションが開発を続けるにつれて、特にネットワーク経由でデータが要求される場合、HTTP クライアントの必要性がますます重要になってきます。従来の PHP 実装では、cURL などのライブラリを使用してネットワーク リクエストを行うのが一般的な方法ですが、非同期リクエストはサポートされていないため、大量のリクエストが同時に発生するとパフォーマンスが制限されます。

Swoole は、PHP ベースのコルーチン ネットワーク通信エンジンで、アプリケーションのパフォーマンスを大幅に向上させる非同期リクエスト メソッドを提供します。この記事では、Swoole を使用して信頼性の高い非同期 HTTP クライアントをカプセル化する方法を紹介します。

Swoole 非同期 HTTP クライアントを使用する理由

同時リクエストが行われると、同期 HTTP クライアントはパフォーマンスのボトルネックを引き起こしますが、非同期 HTTP クライアントは 1 つのプロセスで複数のリクエストを同時に処理できます。 。 Swoole は、プロセスを切り替えることなく非同期リクエストを実装するためのコルーチン モデルを提供し、メモリ使用量と TCP 接続のオーバーヘッドを削減し、アプリケーションのパフォーマンスを向上させることもできます。

Swoole 非同期 HTTP クライアントを使用すると、次の利点もあります:

  • 豊富なイベント コールバック関数を提供し、リクエストが成功または失敗したときに対応する処理操作を実行できます。
  • HTTP リクエストのリクエスト ヘッダー、レスポンス ヘッダー、レスポンス コンテンツを自動的に処理し、開発者が使いやすくします;
  • 統合された接続プール管理により、高い同時実行性で TCP 接続を自動的に管理できます。

非同期 HTTP クライアントの作成

非同期 HTTP クライアントの作成を開始する前に、Swoole 拡張機能をインストールし、PHP バージョンが 7.0 以降であることを確認する必要があります。拡張機能をインストールするには、次のコマンドを使用します。

pecl install swoole
ログイン後にコピー

次に、次の内容を PHP 構成ファイルに追加します。

extension=swoole.so
ログイン後にコピー

次に、非同期 HTTP クライアントのコードの記述を開始できます。まず、非同期 HTTP リクエストを開始するための HttpClient クラスを定義する必要があります。具体的なコードは次のとおりです。

class HttpClient
{
    private $client;

    public function __construct($host, $port = 80, $ssl = false)
    {
        $scheme = $ssl ? 'https://' : 'http://';
        $this->client = new SwooleCoroutineHttpClient($host, $port, $ssl);
        $this->client->setHeaders([
            'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
            'Accept' => 'text/html,application/xhtml+xml,application/xml',
            'Accept-Encoding' => 'gzip',
        ]);
    }

    public async function get($path, $params = [])
    {
        $path .= '?' . http_build_query($params);
        return $this->request('GET', $path);
    }

    public async function post($path, $params = [])
    {
        return $this->request('POST', $path, $params);
    }

    private async function request($method, $path, $params = [])
    {
        $this->client->setMethod($method);
        $this->client->setData($params);
        $this->client->execute($path);

        $statusCode = $this->client->statusCode;
        $body = $this->client->body;

        if ($statusCode !== 200) {
            throw new RuntimeException(sprintf('Request failed with status code %d', $statusCode));
        }

        return $body;
    }
}
ログイン後にコピー

上記のコードでは、__construct メソッドを通じて Swoole の HttpClient オブジェクトを初期化します。 HTTP と HTTPS の両方のプロトコルをサポートする必要があるため、URL のプロトコルを決定し、対応するポート番号と SSL オプションを設定する必要があります。

次に、get メソッドと post メソッドを使用して非同期 HTTP リクエストを実装しました。リクエストでは、http_build_query 関数を使用してパラメータを URL 形式の文字列に変換し、URL 内のパラメータを結合します。次に、$client オブジェクトにリクエスト メソッドとパラメータを設定し、最後に $client->execute メソッドを呼び出してリクエストを開始します。

$client->execute メソッドを使用してリクエストを開始します。Swoole はリクエストと応答を自動的に調整し、応答の到着を待ちます。応答が到着すると、応答のステータス コードと応答本文を取得し、ステータス コードに基づいてリクエストが成功したかどうかを判断できます。

使用例

上記の非同期 HTTP クライアントの使用方法を示すために、簡単な例を作成しました。コードは次のとおりです。

$client = new HttpClient('httpbin.org');

go(function () use ($client) {
    $result = yield $client->get('/get', ['hello' => 'world']);
    var_dump($result);
});

go(function () use ($client) {
    $result = yield $client->post('/post', ['name' => 'Jack', 'age' => 29]);
    var_dump($result);
});
ログイン後にコピー

上記のコードでは、まず HttpClient オブジェクトを初期化し、リモート ホスト アドレスを設定します。次に、go コルーチンを通じて 2 つの非同期リクエストを開始しました。1 つは GET リクエストで、もう 1 つは POST リクエストで、パラメーターは ['hello' => 'world']and ['名前' => 'ジャック', '年齢' => 29]。各非同期リクエストが完了した後、var_dump を通じて応答本文の内容を出力します。

概要

この記事では、Swoole を使用して信頼性の高い非同期 HTTP クライアントをカプセル化し、同時リクエストをサポートする方法を紹介します。 Swoole を使用すると、コルーチンの非同期リクエストを簡単に実装でき、従来の PHP アプリケーションにおける同時リクエストのパフォーマンスのボトルネックを回避できます。

以上がSwoole を使用して信頼性の高い非同期 HTTP クライアントをカプセル化するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート