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

2022-08-31 00:53:54

我们正在尝试调试服务器上的一些 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_VERBOSETRUE 可输出详细信息。将输出写入 STDERR CURLOPT_STDERR 将错误输出到的备用位置,而不是 STDERR。

这也不是权限问题,我已经在服务器端将文件和脚本权限设置为777,我的本地客户端是Windows,并且从不关心权限设置(无论如何,它仅适用于dev)。


答案 1

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

1)您必须在从“详细日志”读取之前调用,因为不执行任何操作,因此在curl_exec()之前不会记录任何内容。curl_exec()curl_setopt()

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);

// ...

?>

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


答案 2

派对有点晚了,但这个页面仍然在谷歌的高处弹出,所以让我们走吧。

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

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


推荐