PHPプログラムを開発するとき、 curl_upkeep()関数を使用すると、HTTP要求された接続を効果的に管理および維持できます。ただし、多くの開発者は、接続がしばしば再構築されていることを発見し、この機能を使用するとパフォーマンスの低下になります。この記事では、接続の頻繁な再構築につながり、ソリューションを提供する可能性のあるいくつかの理由を分析します。
HTTPリクエストを作成する場合、リクエストヘッダーが正しく設定されていることを確認することが重要です。特に、接続とキープヘッダーは、これらのヘッダーが正しく設定されていない場合、サーバーは各リクエストが新しい接続であると考える場合があるため、接続を頻繁に再構築します。
解決:
curl_upkeep()関数に正しいHTTPリクエストヘッダーを必ず設定してください:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://m66.net/some-api-endpoint");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Connection: Keep-Alive", // つながりを保ちます
"Keep-Alive: 300" // 接続を残します3002番
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
「接続:キープアリブ」と「Keep-Alive:300」を設定することにより、サーバーが毎回再構築する代わりに、できるだけ接続を再利用することを確認できます。
curl_upkeep()関数は、デフォルトで特定のタイムアウト制限を設定します。リクエストタイムアウト設定が短すぎてサーバーの応答が時間内に戻らない場合、接続が閉じられ、リクエストが要求されるたびに接続が再確立されます。
解決:
curlopt_timeoutおよびcurlopt_connecttimeoutオプションの時間を調整し、短いタイムアウトによって引き起こされる頻繁な接続再構成を避けるために待機時間を増やします。
curl_setopt($ch, CURLOPT_TIMEOUT, 60); // 最大要求時間を設定します
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // 接続タイムアウト時間を設定します
一部のサーバーには、永続的な接続が有効になっていない場合があります(維持)。クライアントが接続を維持するように設定されている場合でも、サーバーが機能をサポートしていない場合、サーバーは頻繁に接続して再構築されます。
解決:
サーバー側で永続的な接続が有効かどうかを確認します。サーバーの構成にアクセスする許可がある場合は、ApacheまたはNginxの構成をチェックして、Keep-Aliveが有効になっていることを確認してください。
Apache構成ファイルに、次の設定が存在することを確認してください。
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
アプリケーションがロードバランスの取れた環境に展開されている場合、ロードバランサーは接続の頻繁な再構築を引き起こす可能性があります。ロードバランサーは、セッションの損失または構成の問題により、サーバーへの接続を閉じて再確立することがあります。
解決:
ロードバランサーの構成を確認し、セッションの粘着性が有効になっていることを確認するか、頻繁な切断を避けるためにロードバランサーの動作を調整します。
クライアントとサーバーの間で使用されるプロトコルが一致しない場合(HTTP/1.1やHTTP/2など)、頻繁な接続再構築につながる可能性もあります。特に、HTTP/2は、より良い接続マルチプレックス機能を提供します。これは、クライアントとサーバーがプロトコルを正しく交渉しない場合、接続の持続性にも影響する可能性があります。
解決:
curlopt_http_versionを使用して、プロトコルバージョンを明示的に指定します。
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // または CURL_HTTP_VERSION_2
各リクエストでCurlインスタンスが再活性化されている場合、各リクエストに対して新しい接続が確立されます。 Multiplex接続には、Multiplexing Curlインスタンスを検討するか、永続的な接続プール( curl_multi_*関数など)を使用することを検討できます。
解決:
Curlの初期化を毎回避け、接続を維持するためにカールインスタンスを再利用しないようにしてください。