ネットワークリクエストにPHPを使用する場合、 CURLライブラリは非常に強力なツールです。特に、多数のHTTP要求を必要とするシナリオを扱う場合。パフォーマンスを改善するために、Keep-Aliveは、リクエストごとに接続の再確立を避け、リクエストの遅延とリソースの消費を大幅に削減することを避けることができる非常に重要なテクノロジーです。この記事では、 curl_upkeep()を使用して長い接続の多重化を実現し、いくつかの接続メンテナンスのヒントを提供する方法を詳細に説明します。
長い接続は、HTTP接続マルチプレックスのメカニズムであり、各リクエストの新しい接続を再確立するのではなく、TCP接続を複数のHTTP要求間で開いたままにします。これにより、接続確立の時間とリソースのオーバーヘッドを大幅に削減し、特に高い並行性シナリオでパフォーマンスを向上させることができます。
curl_upkeep()は、Curlセッションへの永続的な接続を管理および維持するために一般的に使用されるPHPのカスタム関数です。 PHPには組み込み機能ではありませんが、Curlライブラリのカプセル化に基づいており、接続の多重化の機能を提供します。合理的な構成により、各HTTP要求は同じTCP接続を使用して、繰り返し接続の確立を避けることができます。
curl_upkeep()を使用して長い接続の多重化を実装する方法をよりよく理解するには、まず基本的なCurl構成と接続をアクティブに保つ方法を理解する必要があります。
これは、長い接続の多重化を実装するPHPコードの例です。
function curl_upkeep($url, $headers = array(), $timeout = 30) {
static $ch = null; // 静的変数保存cURLセッション
// 如果セッション不存在,则初始化一个新的セッション
if ($ch === null) {
$ch = curl_init();
// 基本を設定しますcURLオプション
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
// 設定Keep-Alive頭,接続がアクティブなままであることを確認してください
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // 使用HTTP/1.1
curl_setopt($ch, CURLOPT_FORBID_REUSE, false); // 接続の多重化を許可します
curl_setopt($ch, CURLOPT_TCP_KEEPALIVE, 1); // 有効にするTCP Keep-Alive
}
// リクエストを実行します
curl_setopt($ch, CURLOPT_URL, $url);
$response = curl_exec($ch);
// リクエストが成功したかどうかを確認してください
if ($response === false) {
echo "cURL Error: " . curl_error($ch);
}
return $response;
}
// 使用の例
$url = "http://m66.net/api/v1/resource";
$response = curl_upkeep($url);
echo $response;
curl_upkeep()関数は、静的変数$ chを使用してCurlセッションを保存します。このようにして、その後の呼び出しでは、このセッションを再利用して、毎回再活性化を避けることができます。
curl_setopt($ ch、curlopt_http_version、curl_http_version_1_1)は、長い接続マルチプレックスの前提条件であるHTTP/1.1プロトコルの使用を実施します。
curl_setopt($ ch、curlopt_tcp_keepalive、1) TCPのキープアライブ関数を有効にして、複数のリクエスト間で接続がアクティブなままであることを確認します。
Curl_upkeep()を使用する場合、Keep-Aliveを有効にすることに加えて、次の接続メンテナンスのヒントは、長い接続の安定性と効率を改善するのにも役立ちます。
ネットワークの変動やサーバーの問題により、長期的な接続がタイムアウトする場合があります。タイムアウト時間を合理的に設定すると、接続が閉じることを余儀なくされるのを防ぐことができます。
curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 設定连接超时为302番
特別な場合には、接続が予期せず中断される場合があります。リクエストごとに接続を再確立しないようにするために、各リクエストが実行される前に接続ステータスを確認し、セッションを再独立化することができます。
if (!is_resource($ch)) {
$ch = curl_init(); // 重新初始化セッション
}
頻繁にリクエストを必要とする複数のURLがある場合は、接続プールを使用して複数のカールセッションを管理できます。さまざまな接続を多重化することにより、各リクエストの新しい接続の作成を避け、それにより効率が向上する可能性があります。
$ch1 = curl_init("http://m66.net/api/v1/resource1");
$ch2 = curl_init("http://m66.net/api/v1/resource2");
// 設定其他オプション并リクエストを実行します
サーバーのサポート:すべてのサーバーがキープアライブ接続をサポートするわけではなく、サーバー側がHTTP/1.1をサポートし、キープアライブをサポートするように構成されていることを確認する必要があります。
接続の最大数:長い接続が多すぎると、大量のシステムリソースを消費する可能性があり、サーバーまたはクライアントのリソースの使い果たしを回避するために、接続の最大数の合理的な構成を保証します。
接続の閉鎖:長い接続はパフォーマンスを向上させることができますが、一部の要求では、接続が長すぎるとリソースの無駄にもつながる可能性があります。したがって、接続のライフサイクルを合理的に管理することが非常に重要です。