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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值