最新の非常に同時のWeb開発では、APIリクエストでは、多くの場合、大量のHTTP接続を処理する必要があります。効率を改善し、接続を確立して破壊するコストを削減するために、接続の再利用が特に重要になります。 PHPのCurl LibraryとSwooleは、効率的なソリューションを提供します。 curl_upkeep()関数は、swooleと組み合わせて使用され、HTTPリクエストの接続マルチプレックスを効果的に実現し、システムの並行性パフォーマンスを改善します。
この記事では、curl_upkeep()関数を使用して、スウェルとの効率的な接続の多重化を実現し、不必要な接続オーバーヘッドを削減し、それによってアプリケーションのパフォーマンスを向上させる方法を紹介します。
HTTPリクエストを作成する場合、通常、リクエストを開始するには新しいTCP接続が必要です。接続が確立され、データが送信され、接続が閉じられるたびに、一定の時間とリソースが消費されます。接続の多重化により、複数のリクエストが長い接続を維持し、接続を頻繁にセットアップおよび閉鎖するオーバーヘッドを減らし、全体的なパフォーマンスを改善することにより、同じ接続を共有できます。
curl_upkeep()は、ターゲットサーバーへの接続をアクティブに保ち、後続の要求で同じ接続を再利用できるようにするカスタム関数です。 curl_upkeep()を使用することにより、要求するたびに接続の再確立を避けることができます。これにより、潜時とリソースの無駄が大幅に削減されます。
function curl_upkeep($url, $timeout = 30) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Connection: keep-alive', // 使用 keep-alive 頭
]);
curl_exec($ch);
curl_close($ch);
}
上記のコードは、サーバーへの長い接続を維持するためにcurl_upkeep()関数を使用する方法を示しています。接続を設定することにより:維持ヘッダーは、リクエストするたびに接続を再確立するのではなく、接続を維持するようサーバーに指示します。
Swooleは、Coroutine、非同期IO、マルチスレッドおよびその他の機能を提供する高性能PHP拡張であり、PHPの同時処理機能を大幅に改善します。 Swooleがcurl_upkeep()関数と組み合わせて使用されると、単一のプロセスで多数の同時HTTP要求を実装できるため、システムのパフォーマンスがさらに向上します。
Swoole環境では、Coroutinesを介して同時リクエストを実装し、接続マルチプレックスにcurl_upkeep()を使用できます。 Swooleは、コードを簡素化し、効率を向上させるCoroutine HTTPクライアントを提供します。
Swoole Coroutineを介して、複数のCoroutinesでHTTPリクエストを同時に作成し、永続的な接続を共有できます。 curl_upkeep()を使用してSwoole Coroutineを使用する方法の例を次に示します。
use Swoole\Coroutine\Http\Client;
Swoole\Coroutine::create(function () {
// 初期化 Swoole HTTP クライアント
$client = new Client('m66.net', 80);
$client->set([
'timeout' => 3,
'keepalive' => true, // 長い接続を有効にします
]);
// 送信 GET 聞く
$client->get('/path/to/resource');
// つながりを保ちます
curl_upkeep('http://m66.net/path/to/resource');
// 処理応答
echo $client->body;
$client->close();
});
この例では、SwooleのCoroutine HTTPクライアントを使用してリクエストを送信し、 curl_upkeep()を使用して接続をアクティブに保ちます。 KeepAliveを有効にすることにより、クライアントはサーバーへの接続を維持し、複数のリクエスト間で同じ接続を共有します。
接続の多重化の利点を完全に利用するために、複数の同時リクエスト間でカールハンドルを共有することもできます。具体的には、共有Curlリソースプールを使用して接続を管理し、異なるコルーチンまたはリクエスト間の同じ接続を再利用できます。
use Swoole\Coroutine\Pool;
$pool = new Pool(10); // 接続プールを作成します,最大サポート 10 各コルーチンは同時に実行されます
Swoole\Coroutine::create(function () use ($pool) {
$client = $pool->get(); // 接続プールからアイドル接続を取得します
$client->get('http://m66.net/path/to/resource');
$pool->put($client); // 接続を接続プールに戻します
});
curl_upkeep()関数とSwoole Coroutineを使用することにより、接続の多重化を効率的に実装し、システムのスループットと応答速度を大幅に改善できます。 Swooleの非同期IO機能と組み合わせることで、PHPのHTTP要求は、リソース消費を追加せずに、より高い同時リクエストを処理できます。
これらのテクノロジーを使用して、開発者は非常に同時のWebサービスに簡単に対処し、システムの全体的なパフォーマンスを向上させることができます。接続の多重化は、多数の外部API呼び出しを扱う際に非常に実用的な最適化戦略です。