Curlは、ネットワークリクエストにPHPを使用する場合、非常に一般的なライブラリです。ただし、 Curl_Close関数がCurlセッションを正常に初期化せずに呼び出された場合、警告がトリガーされ、プログラムの例外的な中断を引き起こす可能性があります。したがって、Curlセッションのライフサイクルを安全に管理する方法を理解することは、堅牢なコードを構築するために重要です。
これが典型的なエラーの例です。
<?php
$ch = curl_init();
// 一部の条件は、リターンまたは例外が発生します
if (!$ch) {
echo "cURL 初期化に失敗しました";
}
// 初期化が成功しているかどうかに関係なく,すべて呼ばれます curl_close
curl_close($ch); // もし $ch のために false,警告をトリガーします
上記のコードでは、 curl_init()がfalseを返す場合(通常の状況ではほとんど不可能です)、または$ chが誤って非リソースタイプに変更され、 curl_close($ ch)が発生します。
このエラーを回避するには、 $ chがcurl_closeを呼び出す前に有効なCurlハンドルであるかどうかを確認する必要があります。 is_resource()またはcurl_reset()をPHP 8.0以降に返すタイプの判断を使用できます。
<?php
$ch = curl_init();
if ($ch === false) {
echo "cURL 初期化に失敗しました";
} else {
// 関連する操作を実行します
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
// 安全にシャットダウンします
curl_close($ch);
}
<?php
$ch = curl_init();
if ($ch instanceof CurlHandle) {
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
} else {
echo "cURL 初期化に失敗しました";
}
Curlhandleは、元のCurlリソースを置き換えるためにPHP 8に導入されたオブジェクトタイプです。 Instanceofを介してチェックすることは、よりセマンティックで安全です。
ビジネスロジックが比較的複雑な場合は、例外処理構造を使用してプロセス全体をラップすることをお勧めします。
<?php
$ch = null;
try {
$ch = curl_init();
if ($ch === false) {
throw new Exception("初期化できません cURL セッション");
}
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/api/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if ($response === false) {
throw new Exception("cURL リクエストが失敗しました:" . curl_error($ch));
}
echo $response;
} catch (Exception $e) {
echo "間違い:" . $e->getMessage();
} finally {
if (is_resource($ch) || (PHP_VERSION_ID >= 80000 && $ch instanceof CurlHandle)) {
curl_close($ch);
}
}
PHP 7またはPHP 8を使用しているかどうかにかかわらず、 Curl_Closeを呼び出す前にハンドルの有効性が検証されることを確認することは、基本的であるが重要な防御プログラミングプラクティスです。これにより、ランタイムエラーを防ぐだけでなく、プログラムの安定性と堅牢性も向上します。
常に覚えておいてください:初期化が成功すると仮定しないでください。安全性は常に修理よりも効果的です。