代码之家  ›  专栏  ›  技术社区  ›  Alana Storm

您要采取什么步骤来解决php curl的问题?

  •  12
  • Alana Storm  · 技术社区  · 15 年前

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

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

    当curl对你不起作用时,你会使用什么故障排除技术来找出它不起作用的原因?PHP的curl实现有什么奇怪的地方?如果有人在论坛上问一个“哈普我的卷发坏了”的问题,你会采取什么步骤来弄清楚为什么他们的请求不起作用?

    2 回复  |  直到 14 年前
        1
  •  15
  •   VolkerK    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);
      }
    }
        2
  •  3
  •   Emil H    15 年前

    实际上,我从不使用curl(在php中)。PHP流API更整洁,也可以用于发布数据。 Wez Furlong 有一篇关于这个的文章。

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

    <?php
    var_dump($_POST);
    var_dump($_GET);
    var_dump($_SERVER);
    

    是一种方式。另一种方法是使用netcat这样的实用程序监听端口80并将请求发送到:

    netcat -l -p 80
    

    这不会使任何内容返回到curl,但它将允许您确切地看到发送给服务器的内容,这可能足以诊断问题。

    还可以使用 apache_request_headers() 功能。不过,在大多数情况下,我更喜欢netcat方法,因为它可以保证我看到未修改的事实,并显示原始的post数据。