Curlは、HTTP要求にPHPを使用する際に最も一般的に使用されるライブラリの1つです。それを通して、GETリクエストの送信や投稿など、さまざまな機能を実装できます。パフォーマンスを最適化するために、既に確立された接続を再利用して、毎回新しい接続の再確立を避けることができる場合があります。これには、HTTPの長い接続の概念が含まれます。
PHPでは、 curl_upkeep()は、HTTPが長い接続を維持する関数です。それで、 curl_upkeep()は、一度電話をかけて、しばらくの間HTTPの長い接続を開いたままにすることができますか?この記事では、この問題について詳しく説明します。
HTTP Long Connection(Keep-Alive)は、クライアントとサーバーの間の同じ接続が1つのHTTPセッションで複数のリクエストと応答を送信および受信できるようにするテクノロジーです。従来のHTTPプロトコルは、送信されるリクエストごとに新しいTCP接続を確立し、リクエストを送信した直後に接続を閉じます。 HTTP長い接続頻繁な接続の確立と閉鎖のオーバーヘッドを回避し、パフォーマンスを改善し、遅延を減らすことができます。
curl_upkeep()は、Curl接続がアクティブであることを保証する関数です。その主な目的は、長い間リクエストがないときに接続が閉じられないようにすることです。これは、接続をアクティブに保ち、後続の要求に接続の再確立を必要としないようにすることによって行われます。
curl_upkeep()を使用した簡単な例を次に示します。
<?php
// 初期化 cURL セッション
$ch = curl_init();
// 設定 cURL オプション
curl_setopt($ch, CURLOPT_URL, 'https://m66.net/some-endpoint');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 設定超时时间
// 最初のリクエストを行います
$response = curl_exec($ch);
// 電話 curl_upkeep() つながりを保ちます
curl_upkeep($ch);
// 2番目のリクエストを行います,接続が再利用されます
curl_setopt($ch, CURLOPT_URL, 'https://m66.net/another-endpoint');
$response2 = curl_exec($ch);
// 关闭セッション
curl_close($ch);
// 出力応答
echo $response;
echo $response2;
?>
上記のコードでは、最初にCurlセッションを初期化し、 Curl_setopt()を介して要求されたURLおよびその他のオプションを設定します。次に、 curl_upkeep($ ch)を呼び出して接続を維持し、2番目の要求が実行されると、Curlは前の接続を再利用します。
curl_upkeep()は、呼び出されたときに接続をアクティブに保ちますが、1回だけ電話をかけると接続が永久に開いたままになるという意味ではありません。 HTTPの長い接続の持続性は、サーバー側の設定、ネットワーク環境、要求間隔時間など、さまざまな要因の影響を受けます。
サーバー側の設定:
サーバーは通常、タイムアウト時間を設定し、この時間の後、接続は閉じられます。クライアントがアクティブなままであっても、サーバーは接続を積極的に閉じることができます。したがって、単にcurl_upkeep()を呼び出すことは、接続が閉じられないことを保証しない場合があります。
接続プーリングと多重化:
複数のリクエストの接続を再利用する場合は、通常、CURLを使用するときに接続プーリングを有効にする必要があります。これは通常、 curl_multi_*シリーズの関数によって達成されます。 curl_upkeep()は、接続プーリングを直接処理するのではなく、現在の接続のアクティビティを維持するだけです。
接続のための自由時間:
長い間リクエストが行われないときに接続がアイドル状態になった場合、サーバー側または中間プロキシが接続を閉じることができます。したがって、クライアントにcurl_upkeep()が呼び出されたとしても、あまりにも長い間アイドル状態になっている接続は、サーバーまたはプロキシによってまだ閉じられている場合があります。
curl_upkeep()は、HTTPの長い接続をアクティブに保つのに役立ちますが、それは完全に目的ではありません。 「接続を中断しないようにする」ことができるかどうかは、サーバー側の構成、ネットワーク環境、要求の頻度など、複数の要因に依存します。したがって、 curl_upkeep()は、電話後に接続が閉じないことを必ずしも保証するものではありません。より高度な接続の再利用メカニズムが必要な場合は、Curlの接続プール管理の使用またはHTTPの長い接続を管理するためにより専門的なライブラリを使用することを検討できます。
この記事が、curl_upkeep()の役割と制限をよりよく理解するのに役立つことを願っています。