在 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