使cURL输出STDERR为文件(或字符串)

Rad*_*ire 13 php curl stderr verbose

我们正在尝试调试服务器上的一些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...
?>
Run Code Online (Sandbox Code Playgroud)

从PHP手册:http://php.net/manual/en/function.curl-setopt.php

CURLOPT_VERBOSE TRUE输出详细信息.将输出写入STDERR CURLOPT_STDERR输出错误的替代位置而不是STDERR.

它也不是权限问题,我已经在服务器端为777设置了文件和脚本权限,而我的本地客户端是Windows,并且从未关心权限设置(它只适用于dev).

小智 8

你在你的例子中犯了几个错误:

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, array(
    CURLOPT_URL             => $url,
    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);

// ...

?>
Run Code Online (Sandbox Code Playgroud)

注意:详细日志可能超过2048字节,因此您可以在curl_exec()之后"fclose"$ curl_log,然后使用例如file_get_contents()读取整个文件.在这种情况下,第2点不应被视为错误:-)


Dav*_*unz 6

派对有点晚了,但是这个页面仍然在谷歌中崭露头角,所以我们走吧.

如果CURLINFO_HEADER_OUT也设置为TRUE,则CURLOPT_VERBOSE似乎不会记录任何内容.

这是PHP中的一个已知错误(#65348),并且由于他们决定不修复它的原因.