Curlは、ネットワークリクエストにPHPを使用する場合、非常に強力なツールです。ただし、多くの開発者は、複数のリクエストを処理したり、データを再利用しようとしている場合に共通の問題に遭遇します。
この問題を理解するには、Curlの内部メカニズムとリソース管理から始める必要があります。
Curlは、「ハンドル」と呼ばれるメカニズムを使用して、リクエストのコンテキストを維持します。 curl_init()を呼び出すと、PHPはリソースを作成します。これは、HTTPリクエストの構築に使用される「ハンドル」です。次に、 curl_setopt()を使用してさまざまなパラメーターを設定し、最後にcurl_exec()を介してリクエストを実行します。
典型的なカール要求プロセスは次のとおりです。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
curl_close()の目的は、curl_init()を介して以前に作成されたリソースをリリースすることです。これはつまり:
接続が閉じられています。
すべての設定(URL、リクエストヘッダーなどを含む)は破壊されます。
リクエストに関連するすべての内部バッファ(応答ボディを含む)もクリーニングされます。
したがって、 curl_close()を呼び出すと、Curl要求で使用されるコンテキストを完全に破壊することに相当します。以前に応答変数を保存した場合でも、一部のリソースがリリースされるため、特定の内部データ(元のハンドルの送信情報など)にアクセスできなくなる場合があります。
例えば:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// 次に、リクエスト情報を取得してみてください
$info = curl_getinfo($ch); // これは失敗します,$ch 無効
上記の例では、 $ chが閉じてクリアされているため、 curl_getinfo()を使用できなくなりました。
接続を閉じた後に応答データを保持する必要がある場合は、ハンドルを閉じる前に必要なデータを抽出できます。例えば:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/user/profile");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
// 今 $response そして $info すべてが安全です
curl_close()の前に必要なすべてを抽出する限り、接続を閉じることは完全に問題ありません。
同時リクエストまたは高性能シナリオの場合、 curl_multi_init()を使用して複数のハンドルをマルチプレックスするか、永続的な接続(キープアライブ)テクノロジーを使用することを検討できます。 PHPは、接続の多重化とリソース管理を内部的によりインテリジェントに処理するGuzzleなどのHTTPクライアントもサポートしています。
curl_close()が呼び出された後、Curlのすべてのコンテキストとリソースがリリースされます。これは、以前の要求されたデータを送信または取得できなくなる根本原因です。正しいアプローチは、接続を閉じる前に必要な応答コンテンツまたは要求情報を抽出することです。 Curlのリソースライフサイクルを理解することで、HTTP通信のためにより安全かつ効率的に使用することができます。