您采取了哪些步骤来解决PHP cURL的问题?

您采取了哪些步骤来解决PHP cURL的问题?,php,debugging,http,curl,Php,Debugging,Http,Curl,几乎所有正在工作的PHP程序员都必须使用CURL来发送原始HTTP请求,无论是用于信用卡支付处理、恶意的屏幕抓取还是介于两者之间的其他用途 几乎所有PHP程序员聚集的论坛都有大量的人参与其中 当cURL对您不起作用时,您会使用哪些故障排除技术来找出它不起作用的原因?你在PHP的curl实现中遇到了什么奇怪的问题?如果有人在论坛上问一个“HALP MY CURL IZ break”的问题,你会采取什么步骤来找出他们的请求不起作用的原因?事实上,我从不使用CURL(在php中)。PHP流api更整洁

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

几乎所有PHP程序员聚集的论坛都有大量的人参与其中


当cURL对您不起作用时,您会使用哪些故障排除技术来找出它不起作用的原因?你在PHP的curl实现中遇到了什么奇怪的问题?如果有人在论坛上问一个“HALP MY CURL IZ break”的问题,你会采取什么步骤来找出他们的请求不起作用的原因?

事实上,我从不使用CURL(在php中)。PHP流api更整洁,也可以用于发布数据。有一篇关于这方面的文章

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

<?php
var_dump($_POST);
var_dump($_GET);
var_dump($_SERVER);
这不会将任何内容返回给curl,但它将允许您准确地查看发送到服务器的内容,这可能足以诊断问题


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

我发现CURLINFO\u HEADER\u 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); } }
关于流库,这是一个很好的观点。如果关闭了fopen url包装器,流函数是否可用?流函数可能可用,但我链接到的示例仍然要求使用fopen()完成实际连接,这意味着在关闭allow_url_fopen的情况下它将无法工作。如果是这样,你就注定要使用curl。就我个人而言,我总是打开它,避免犯从一开始就把url fopen变成安全问题的错误。:)我非常喜欢流api。作为旁注:php(或curl扩展)可以编译为使用curl作为一些url包装的处理程序。是的,整个fopen url包装问题可能会阻止流函数将curl作为使用php进行http请求的默认方式。这也适用于post数据吗??我收到错误
警告:curl\u exec()[function.curl exec]:无法在C:\xampp\htdocs\my\u project\login.php中调用CURLOPT\u WRITEFUNCTION,其中第49行中有write
$res=curl\u exec($curl)是,它也适用于POST数据。看起来您传递给curl_setopt/CURLOPT_WRITEFUNCTION的函数名实际上并没有解析为函数/callable.Wow,这是一个非常干净高效的解决方案。真的帮了我很多忙,谢谢!只需使用CURLOPT_头即可获取头。。不需要这个功能
<?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);
  }
}