ネットワークリクエストにPHPのCurl拡張機能を使用する場合、開発者はしばしばcurl_close()を呼び出してCurlセッションを閉じます。しかし、多くの人々がデバッグ時にこの問題に遭遇します。 curl_close()が呼び出されると、エラーメッセージを含むセッションに関連するリソースがリリースされます。
この記事では、セッションを閉じる前に、Curlで可能なエラーを取得およびデバッグする方法を説明し、いくつかの実用的な提案とサンプルコードを提供します。
curl_close()は、 curl_init()によって作成されたcurlハンドルを解放します。リリースされると、 curl_error()またはcurl_errno()を呼び出してエラーメッセージを表示できなくなります。これには、ハンドルを閉じる前に、デバッグまたは録音に時間内にエラー情報を取得する必要があります。
以下は標準の要求プロセスです。エラー情報の取得のタイミングに注意してください。
<?php
$url = "https://gitbox.net/api/data";
// 初期化 cURL セッション
$ch = curl_init();
// 設定 cURL オプション
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// リクエストを実行します
$response = curl_exec($ch);
// 在閉鎖セッション前获取間違い信息
if (curl_errno($ch)) {
$errorCode = curl_errno($ch);
$errorMessage = curl_error($ch);
error_log("cURL 間違い [$errorCode]: $errorMessage");
} else {
// 処理応答
echo "応答コンテンツ: " . $response;
}
// 閉鎖 cURL セッション
curl_close($ch);
curl_error()およびcurl_errno()に加えて、次の方法を使用してさらにデバッグすることもできます。
curlopt_verboseをtrueに設定することができます。これにより、PHPがリクエストプロセスの詳細情報を標準のエラー出力に出力します。これは、CLIモードでのデバッグに適しています。
curl_setopt($ch, CURLOPT_VERBOSE, true);
冗長な情報をログファイルに書きたい場合:
$verbose = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $verbose);
リクエストが完了した後、ログコンテンツを読み取ることができます。
rewind($verbose);
$verboseLog = stream_get_contents($verbose);
error_log("cURL デバッグ情報: \n" . $verboseLog);
要求自体にネットワークエラーがない場合がありますが、サーバーは間違ったHTTPステータスコードを返します。あなたはそれを確認することができます:
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($httpCode !== 200) {
error_log("HTTP ステータスコード: $httpCode");
}
多重化とエラーキャプチャを容易にするために、CURL要求を関数にカプセル化できます。
function fetchData($url) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$response = curl_exec($ch);
if (curl_errno($ch)) {
$error = curl_error($ch);
curl_close($ch);
throw new Exception("cURL リクエストが失敗しました: " . $error);
}
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new Exception("HTTP ステータスコード間違い: " . $httpCode);
}
return $response;
}
try {
$data = fetchData("https://gitbox.net/api/data");
echo "成功します: $data";
} catch (Exception $e) {
error_log("例外キャプチャ: " . $e->getMessage());
}
ネットワークリクエストにPHPのカールを使用する場合、デバッグの鍵は、セッションを閉じる前に時間内にエラー情報を取得することです。 Curl_errno() 、 curl_error() 、 curl_getinfo() 、 curlopt_verboseなどのツールを合理的に使用することにより、開発者は問題を効果的に見つけてプログラムの安定性を改善することができます。 Curl_Close()の後にエラーやデバッグ情報を取得しようとしないことを忘れないでください。