Web アプリケーションが開発を続けるにつれて、特にネットワーク経由でデータが要求される場合、HTTP クライアントの必要性がますます重要になってきます。従来の PHP 実装では、cURL などのライブラリを使用してネットワーク リクエストを行うのが一般的な方法ですが、非同期リクエストはサポートされていないため、大量のリクエストが同時に発生するとパフォーマンスが制限されます。
Swoole は、PHP ベースのコルーチン ネットワーク通信エンジンで、アプリケーションのパフォーマンスを大幅に向上させる非同期リクエスト メソッドを提供します。この記事では、Swoole を使用して信頼性の高い非同期 HTTP クライアントをカプセル化する方法を紹介します。
同時リクエストが行われると、同期 HTTP クライアントはパフォーマンスのボトルネックを引き起こしますが、非同期 HTTP クライアントは 1 つのプロセスで複数のリクエストを同時に処理できます。 。 Swoole は、プロセスを切り替えることなく非同期リクエストを実装するためのコルーチン モデルを提供し、メモリ使用量と TCP 接続のオーバーヘッドを削減し、アプリケーションのパフォーマンスを向上させることもできます。
Swoole 非同期 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 サイトの他の関連記事を参照してください。