我们正在尝试在服务器上调试一些cURL错误,我想看到STDERR日志.目前,我们可以看到我们的错误是“错误代码:7”,我们无法连接到目标服务器.我们已经联系了主机,并制定了特殊规则来开放我们需要的港口,我们甚至暂时忽略证书.
不过,我们无法连接.我需要调试这个,但是我看不到任何有关的信息.
提到“VERBOSE”和“STDERR”的线条是我最重要的.没有任何东西写入$curl_log.我究竟做错了什么?遵循手册逻辑,这应该是正确的…
使用PHP
<?PHP $curl = curl_init(); $curl_log = fopen("curl.txt",'w'); $url = "http://www.google.com"; curl_setopt_array($curl,array( CURLOPT_URL => $url,// Our destination URL CURLOPT_VERBOSE => 1,// Logs verbose output to STDERR CURLOPT_STDERR => $curl_log,// Output STDERR log to file CURLOPT_SSL_VERIFYPEER => 0,// Do not verify certificate CURLOPT_FAILONERROR => 0,// true to fail silently for http requests > 400 CURLOPT_RETURNTRANSFER => 1 // Return data received from server )); $output = fread($curl_log,2048); echo $output; // This returns nothing! fclose($curl_log); $response = curl_exec($curl); //...restofscript... ?>
从PHP手册:http://php.net/manual/en/function.curl-setopt.php
CURLOPT_VERBOSE TRUE to output verbose information. Writes output to STDERR
CURLOPT_STDERR An alternative location to output errors to instead of STDERR.
这不是一个权限问题,我已经在服务器端设置了777的文件和脚本权限,我的本地客户端是Windows,并且从来没有关心权限设置(它只适用于开发人员).
你在你的例子中犯了几个错误:
1)您必须在从“详细日志”读取之前调用curl_exec(),因为curl_setopt()不执行任何操作,因此在curl_exec()之前不能记录任何内容.
2)你打开$curl_log = fopen(“curl.txt”,“w”);只有写,所以没有什么可以读,即使你写入文件并倒回内部文件指针.
所以正确的缩短代码应该如下所示:
<?PHP $curl = curl_init(); $curl_log = fopen("curl.txt",'rw'); // open file for READ and write $url = "http://www.google.com"; curl_setopt_array($curl,CURLOPT_VERBOSE => 1,CURLOPT_STDERR => $curl_log,CURLOPT_RETURNTRANSFER => 1 )); $response = curl_exec($curl); rewind($curl_log); $output= fread($curl_log,2048); echo "<pre>". print_r($output,1). "</pre>"; fclose($curl_log); // ... ?>
注意:详细日志可能长于2048字节,因此您可以在curl_exec()之后“fclose”$curl_log,然后使用file_get_contents()读取整个文件.在这种情况下,点2)不应被视为错误:-)