PHP 中 cURL 的錯誤調試


在 PHP 中使用 cURL 有時會遇到錯誤,我們來看看如何調試 cURL 的錯誤。

首先可以使用的是 curl_errno 和 curl_error 函數,分別返回 HTTP 的錯誤代碼和錯誤類別。例如:

<?php
$ch = curl_init('http://example.com/');
curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Curl error: ' . curl_error($ch);
}
curl_close($ch);
?>

其次,如果需要得到更詳細的信息,可以用 curl_getinfo 函數。例如:

<?php
$ch = curl_init('http://example.com/');
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);
if (!curl_errno($ch)) {
    print_r(curl_getinfo($ch));
}
curl_close($ch);
?>

其中設置 CURLINFO_HEADER_OUT 選項之后 curl_getinfo 函數返回的數組將包含 cURL 請求的 header 信息。而要看到回應的 header 信息可以在 curl_setopt 中設置 CURLOPT_HEADER 選項為 true。

curl_exec 函數執行成功時,將根據 CURLOPT_RETURNTRANSFER 選項的值處理回應的正文信息:如果為 true 將作為字符串返回,如果為 false 將直接輸出。執行失敗時結果為 FALSE。也就是說,如果執行失敗(假設是 400 錯誤),從 curl_exec 函數的結果中沒法看到回應的正文(里面可能包含更加具體的錯誤信息)。要看到回應正文,有兩種方法。第一種方法是設置 400 為成功的代碼,例子如下:

 curl_setopt($ch, CURLOPT_FAILONERROR, false);
 curl_setopt($ch, CURLOPT_HTTP200ALIASES, array(400));

第二種方法是設置 CURLOPT_VERBOSE 為 true,同時將 CURLOPT_STDERR 設置為用 fopen 打開的一個文件。這樣 cURL 將把和服務器的所有交互信息都記錄到該文件中。

最后一個問題是:如何在 cURL 中看到請求的正文信息?這個問題似乎沒看到解決辦法。特別是你用 cURL 上傳文件時,如果出錯了,你不容易知道到底哪里出問題了。這個是 cURL 不好之處,你可以改用 fsockopen 或者 pfsockopen 試試。

參考資料:
[1] Debugging Curl | Practical PHP Programming
[2] Using PHP curl how does one get the response body for a 400 response
[3] PHP cURL retrieving response headers AND body in a single request?
[4] PHP 手冊:pfsockopen


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM