現在の位置: ホーム> 最新記事一覧> curl_upkeep()関数分析:使用されていない場合の時間のかかる接続の詳細な比較

curl_upkeep()関数分析:使用されていない場合の時間のかかる接続の詳細な比較

M66 2025-06-23

PHPでは、 Curl Extensionは非常に重要なツールであり、クライアントとサーバー間でデータを交換できるようにします。通常、 Curlを使用してHTTPリクエストを送信するか、サーバーからデータを取得します。ただし、複数のリクエストが行われると、接続の確立時間を最適化することが特に重要になります。

curl_upkeep()関数は、特に重複したHTTPリクエストで、HTTP接続を保持および多重化するための関数です。要求するたびに接続を再確立し、接続の確立によって引き起こされるレイテンシを減らし、それによりパフォーマンスが向上することを避けることができます。この記事では、curl_upkeep()を使用した場合、およびこの関数を使用せずに、時間のかかる接続作成の詳細な比較を分析します。

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()の使用と使用の使用の時間のかかる比較

curl_upkeep()によってもたらされるパフォーマンスの改善をよりよく理解するために、以下の実用的な例と比較します。

シナリオ1: 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ミリ秒かかると仮定します。

シナリオ2: curl_upkeep() (複数の接続)を使用します

この場合、接続プールは多重化されており、要求されるたびに接続を再確立することを回避します。 curlopt_forbid_reusecurlopt_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()を使用して接続管理を最適化し、不必要な接続確立時間を回避することをお勧めします。