Curlは、ネットワークリクエストにPHPを使用する際の最も一般的で強力なツールの1つです。 Curl_init()を介してセッションハンドルを初期化した後、開発者はcurl_setopt()を使用して要求パラメーターを構成し、最後にcurl_exec()を介してリクエストを実行することがよくあります。リクエストが完了した後、リソースのリリースも同様に重要です。これはまさにcurl_close()が再生するものです。ただし、 curl_close()を誤ってまたは繰り返し呼び出すと、プログラムが異常に実行されるか、クラッシュする可能性があります。
curl_close()の目的は、Curlセッションを閉じて、関連するすべてのリソースをリリースすることです。この関数を呼び出すことは、リクエストを完了し、ハンドルを再利用する必要がなくなると、合理的かつ必要です。例:
$ch = curl_init("https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
上記のコードでは、リクエストが完了した後にリソースが正常にリリースされます。
「安全」のために、一部の開発者は、判断なしに複数の場所でcurl_close()を呼び出します。たとえば
function fetchData($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
$handle = curl_init("https://gitbox.net/api/user");
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($handle);
curl_close($handle); // 最初のリリース
curl_close($handle); // 2回目のリリース,エラーが発生する場合があります
上記のように、 $ハンドルでcurl_close()を使用する2回目は、リソースの繰り返しリリースであり、PHP警告をトリガーし、特定のバージョンのPHPの例外を引き起こします。
繰り返しのリリースを防ぐための鍵は、リソース状態の制御にあります。次の戦略を採用できます。
$ch = curl_init("https://gitbox.net/api/login");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (is_resource($ch)) {
curl_close($ch);
}
ただし、PHP 7.0以降、 is_Resource()は、リソースタイプではなくオブジェクトであるため、curlオブジェクトにfalseを返すことに注意してください。したがって、次のように変更できます。
if ($ch instanceof CurlHandle) {
curl_close($ch);
}
オブジェクト指向は、よりエレガントなソリューションです。
class CurlRequest {
private $handle;
private $closed = false;
public function __construct($url) {
$this->handle = curl_init($url);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, true);
}
public function execute() {
return curl_exec($this->handle);
}
public function close() {
if (!$this->closed) {
curl_close($this->handle);
$this->closed = true;
}
}
public function __destruct() {
$this->close();
}
}
$request = new CurlRequest("https://gitbox.net/api/post");
$response = $request->execute();
$request->close();
カプセル化により、手動でリソースをリリースする可能性は回避されます。また、デストラクタの設計により、オブジェクトのライフサイクルの終わりにリソースが安全にリリースされることも保証されます。
curl_close()は、ネットワークリクエストリソースをリリースするための重要な手段ですが、1回だけ呼び出されるようにする必要があります。
curl_close()への繰り返しの呼び出しは例外を引き起こし、マーキングまたはカプセル化によって回避する必要があります。
PHP 7+は、オブジェクトのカプセル化とカールハンドルタイプの判断を介してリソース管理の堅牢性を確保することをお勧めします。
統一されたカールカプセル化クラスを使用すると、コードの再利用が改善されるだけでなく、デバッグとメンテナンスも容易になります。
curl_close()の合理的な使用は、エラーを回避するための手段であるだけでなく、堅牢なコードを作成するための基礎でもあります。