您采取了哪些措施来解决PHP cURL的问题?

时间:2009-05-02 23:39:13

标签: php debugging http curl

几乎所有正在运行的PHP程序员都必须使用CURL来发送原始HTTP请求,无论是用于信用卡支付处理,恶意屏幕抓取还是介于两者之间。

几乎所有PHP程序员聚集的论坛都有很多人can't get the cURL functions to do what they want

当cURL不适合您时,您使用什么故障排除技术来弄清楚它为什么不起作用? PHP的卷曲实现有什么奇怪的问题你遇到了什么?如果有人在论坛上询问“HALP MY CURL IZ BROKEN”问题,您采取了哪些步骤来弄清楚他们的请求无效的原因?

2 个答案:

答案 0 :(得分:15)

我发现CURLINFO_HEADER_OUT选项非常有用。

<?php
$curl = curl_init('http://www.php.net');

curl_setopt($curl, CURLOPT_HEADERFUNCTION, 'dbg_curl_data');
curl_setopt($curl, CURLOPT_WRITEFUNCTION, 'dbg_curl_data');
curl_setopt($curl, CURLINFO_HEADER_OUT, true);

curl_exec($curl);

echo '<fieldset><legend>request headers</legend>
  <pre>', htmlspecialchars(curl_getinfo($curl, CURLINFO_HEADER_OUT)), '</pre>
</fieldset>';

echo '<fieldset><legend>response</legend>
  <pre>', htmlspecialchars(dbg_curl_data(null)), '</pre>
</fieldset>';

function dbg_curl_data($curl, $data=null) {
  static $buffer = '';

  if ( is_null($curl) ) {
    $r = $buffer;
    $buffer = '';
    return $r;
  }
  else {
    $buffer .= $data;
    return strlen($data);
  }
}

答案 1 :(得分:3)

实际上,我从不使用CURL(在php中)。 PHP流API非常简洁,也可以用于POST数据。 Wez Furlong有一篇关于此的文章。

如果我要使用它?我首先打开所有消息(将错误报告设置为E_ALL)。如果我发现PHP没有告诉我在错误消息中需要什么,我可能会使用代理方法来查看实际发生的情况。将目标URL更改为包含

之类的本地php页面
<?php
var_dump($_POST);
var_dump($_GET);
var_dump($_SERVER);

是一种方式。另一种方法是使用像netcat这样的实用程序来侦听端口80并在那里发送请求:

netcat -l -p 80

这不会返回任何卷曲的内容,但它可以让您查看服务器发送的确切内容,这可能足以诊断问题。

您还可以使用apache_request_headers()函数从PHP检索标头。在大多数情况下,我更喜欢netcat方法,因为它保证我看到未经修改的事实,并且还显示原始的帖子数据。