PHPでは、HTTPリクエストにCurlを使用することは一般的な慣行であり、 curl_close()関数はcurl_init()によって作成されたCurlセッションリソースを解放するために使用されます。ただし、多くの開発者は、 Curl_Close()を使用した後、特に高い並行性または長い接続を備えたアプリケーションシナリオで、基礎となる接続を完全に閉じるかどうかを心配しています。この記事では、Curl_Close()を呼び出した後、すべてのCurl接続が実際に正しく閉じられていることを確認する方法について説明します。
curl_close($ ch)は、 curl_init()によって割り当てられたリソースを単純にリリースします。これは、必ずしも基礎となるネットワーク接続をすぐに閉じるとは限りません。 Curlは、特にKeep-AliveおよびHTTP/2 MultiplexingをHTTP/1.1でマルチプレックスする場合、接続の再利用と接続プーリングを内部実装でサポートします。接続は、後続のリクエストのために予約される場合があります。
これは、 curl_close()が呼び出されたとしても、基礎となるTCP接続がLibcurlによって開いて管理されることを意味します。
LibcurlはC言語ライブラリであるため、その内部接続管理はPHP開発者に直接さらされていません。したがって、PHPネイティブ平均を介してシステムレベルから接続が切断されているかどうかを直接「確認」することは不可能です。
ただし、間接的な確認または管理は、次の方法で実行できます。
Curlopt_verboseを設定して、接続の確立と閉鎖を観察することにより、Curlのデバッグ出力を取得できます。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://gitbox.net/api/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true); // デバッグ出力を有効にします
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);
$response = curl_exec($ch);
curl_close($ch);
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
fclose($verbose);
echo "cURL デバッグ情報:\n";
echo $verboseLog;
情報をデバッグすることにより、「接続を閉じる」または「まだ使用中の接続」などの単語が存在するかどうかを確認し、接続が実際に閉じられているかどうかを分析するのに役立ちます。
接続を閉じるために、多重化動作を明示的に無効にすることができます。
curl_setopt($ch, CURLOPT_FORBID_REUSE, true);
この設定により、Curlは接続を再利用しないように指示し、要求が完了した後、基礎となる接続を強制的に閉じることができます。これは、接続を保証する必要があるが、パフォーマンスの損失をもたらす可能性があるシナリオでは特に重要です。
サーバー側では、 NetStat 、 LSOF 、またはSSコマンドを使用して、スクリプト実行の前後に状態比較を実行できます。
netstat -anp | grep :443
または:
lsof -i :443
ただし、これはデバッグ環境にのみ適用されます。パフォーマンスの影響を防ぐために、生産環境でそのようなコマンドを頻繁に使用することはお勧めできません。
curl_multi_*シリーズの関数を使用すると、リソースのリリースがより複雑です。各ハンドルが閉じている場合でも、 curl_multi_close()を呼び出す必要があります。
$mh = curl_multi_init();
// 複数を追加します curl handle
// ...
curl_multi_close($mh);
curl_multi_close()がないと、いくつかの接続が正しくリサイクルされない場合があります。
一部のフレームワーク(ガズルなど)もCurlを使用していますが、接続プーリングロジック自体を実装する場合があります。この場合、PHPスクリプトでハンドルを閉じたとしても、接続はフレームワークによって管理され、すぐに閉じることができません。このシナリオでは、フレームワークの接続マルチプレックス戦略を確認する必要があります。
Curl_close()は、リソースを解放するためのPHPの標準的な慣行ですが、基礎となる接続がすぐに閉じられることを完全に保証するものではありません。接続が閉じているかどうかを確認するには、次のことができます。
curlopt_verboseを使用して、デバッグログを出力します。
curlopt_forbid_reuseを強制的に切断するように設定します。
システムコマンドを使用して、デバッグ中に接続ステータスを観察します。
マルチカールハンドルを正しく閉じます。
接続の管理に使用されるフレームワークまたは環境を理解します。
これらのメカニズムを理解することは、より効率的で制御可能なHTTPクライアントロジックを構築するのに役立ちます。