PHPでは、 Curl Extensionは非常に重要なツールであり、クライアントとサーバー間でデータを交換できるようにします。通常、 Curlを使用してHTTPリクエストを送信するか、サーバーからデータを取得します。ただし、複数のリクエストが行われると、接続の確立時間を最適化することが特に重要になります。
curl_upkeep()関数は、特に重複したHTTPリクエストで、HTTP接続を保持および多重化するための関数です。要求するたびに接続を再確立し、接続の確立によって引き起こされるレイテンシを減らし、それによりパフォーマンスが向上することを避けることができます。この記事では、curl_upkeep()を使用した場合、およびこの関数を使用せずに、時間のかかる接続作成の詳細な比較を分析します。
curl_upkeep()は、サーバーへの永続的な接続を維持するカスタム関数(または特定のライブラリを介して実装された関数)です。そのコア機能は、特に同じサーバーにリクエストを頻繁に送信する必要がある場合、接続プールを持続することにより、TCP接続を繰り返し確立するオーバーヘッドを減らすことです。効果は特に明白です。
通常、HTTPプロトコルはステートレスです。つまり、リクエストごとに新しいTCP接続が確立されます。毎回接続を再確立しないようにするために、接続を永続的に保つためにいくつかのパラメーターを設定できます。たとえば、 Curlは、接続を設定することにより、接続をアクティブに保ちます:Keep-Aliveヘッダー。
$ch = curl_init();
// アクティブを維持するために接続を設定します
curl_setopt($ch, CURLOPT_URL, 'https://m66.net/api/endpoint');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Connection: keep-alive'
));
// リクエストを実行します
$response = curl_exec($ch);
curl_close($ch);
上記のコードは、 M66.NETとの接続をアクティブに保ち、要求するたびに接続を再確立することを避けます。
curl_upkeep()によってもたらされるパフォーマンスの改善をよりよく理解するために、以下の実用的な例と比較します。
この場合、リクエストが送信されるたびに、TCP接続を再確立する必要があります。この接続確立プロセスには、通常、DNS解像度、3回の握手、およびその他の操作が含まれるため、長い時間がかかります。
$ch = curl_init();
// 永続的な接続を使用しないでください,要求するたびに接続を再確立します
curl_setopt($ch, CURLOPT_URL, 'https://m66.net/api/endpoint');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// リクエストを実行します
$response = curl_exec($ch);
curl_close($ch);
この例では、 CurlはCurl_exec()が呼び出されるたびに新しい接続を作成します。 DNSの解像度と接続の確立が約200ミリ秒かかると仮定します。
この場合、接続プールは多重化されており、要求されるたびに接続を再確立することを回避します。 curlopt_forbid_reuseとcurlopt_keep_sendingを設定することにより、マルチプレックス接続の効果を実現できます。接続の再利用を維持することは同じサーバーに対してのみ有効であることに注意する必要があります。そのため、異なるドメイン名に頻繁にアクセスすると、効果が大幅に削減されます。
$ch = curl_init();
// 接続を維持するための設定
curl_setopt($ch, CURLOPT_URL, 'https://m66.net/api/endpoint');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, true); // 接続の再利用を無効にします
curl_setopt($ch, CURLOPT_KEEP_SENDING, true); // つながりを保ちます
// リクエストを実行します
$response = curl_exec($ch);
curl_close($ch);
マルチプレックス接続の場合、複数のリクエストを送信する必要がある場合、接続が多重化され、DNS解像度、3つのハンドシェイク、およびその他のプロセスが節約され、各リクエストの時間がかかる時間が大幅に短縮されます。
リクエスト数 | curl_upkeep() (ms)を使用していない | curl_upkeep() (ms)を使用する |
---|---|---|
1 | 200ms | 100ms |
10 | 2000ms | 1000ms |
100 | 20000ms | 10000ms |
上記の表からわかるように、 curl_upkeep()を使用して接続をマルチプレックスした後、各要求で消費される時間は大幅に短縮されます。特にリクエストの数が増えると、マルチプレックス接続の利点はより明白です。
curl_upkeep()関数は、TCP接続を維持および多重化することにより、頻繁な接続確立のオーバーヘッドを大幅に削減し、それによりレイテンシを削減し、パフォーマンスを改善します。特に、リクエストを同じサーバーに複数回送信する必要があるシナリオでは、効果がさらに顕著です。
したがって、PHPプロジェクトで同じサーバーと頻繁に通信する場合は、 curl_upkeep()を使用して接続管理を最適化し、不必要な接続確立時間を回避することをお勧めします。