(Linux CLI PHP)捕获CURL';在执行期间将详细输出到文件

(Linux CLI PHP)捕获CURL';在执行期间将详细输出到文件,php,linux,curl,command-line,Php,Linux,Curl,Command Line,我刚刚注意到,如果运行一个使用curl的命令行php脚本,并且启用了CURLOPT_VERBOSE选项,则无法捕获输出 例如: $php myscript.php > logfile.txt 2>&1 所有PHP输出都将进入日志文件,但是curl的输出仍然会出现在屏幕上 如何用curl输出捕获两个PHP输出 $ch = curl_init(); // Initialising cURL curl_setopt($ch, CURLOPT_VERBOSE, T

我刚刚注意到,如果运行一个使用curl的命令行php脚本,并且启用了CURLOPT_VERBOSE选项,则无法捕获输出

例如:

$php myscript.php > logfile.txt 2>&1
所有PHP输出都将进入日志文件,但是curl的输出仍然会出现在屏幕上

如何用curl输出捕获两个PHP输出

    $ch = curl_init();  // Initialising cURL
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    curl_setopt($ch, CURLOPT_USERAGENT, $this->agentString);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_URL, $url);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    $data = curl_exec($ch); 
    curl_close($ch);
编辑:

添加行

curl_setopt($ch, CURLOPT_STDERR, STDOUT);
看起来很有意思。但是,现在看来curl输出与php的输出冲突,并用自己的输出覆盖日志文件。奇怪

编辑2:

这很有效

 $php myscript.php >> logfile.txt 2>&1

事实上,我的第一个答案是错误的。cURL的手册页面上说:

URLOPT_VERBOSE TRUE以输出详细信息。将输出写入 STDERR,或使用curloptu STDERR指定的文件

因此,为
CURLOPT\u STDERR
指定
STDOUT
将起作用:

curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, STDOUT);
原始答案


检查您是否也设置了
CURLOPT\u RETURNTRANSFER

如果您正在寻找PHP解决方案,可以使用CURL选项:

...
// this returns the data instead of outputing it
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// output the data
echo curl_exec($ch);
或者,您可以缓冲并刷新输出:

// turn on output buffering
ob_start();

// do some curl operations here

// flush and turn off buffering
ob_end_flush();

我想我应该做一个实际的回答,而不仅仅是一个评论。 我刚意识到你想要所有的内容

ob_start()

$ch = curl_init();  // Initialising cURL
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, $this->agentString);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_URL, $url);    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
$data = curl_exec($ch); 
curl_close($ch);

// What ever other functions you want run...

// discard content: ob_end_clean()
$extra_curl_stuff = ob_get_flush();
// save $extra_curl_stuff to your logfile too...

Haig Bedrosian建议使用输出缓冲区,但不是使用
ob\u end\u flush()
而是使用
ob\u end\u clear()
insteadob不工作,这就是问题所在。在不修改第三方客户端的情况下,我们无法修改curl选项,因此我们正在寻找一种灵活的方法,在不需要详细/调试时隐藏此垃圾邮件信息。客户端不允许更改其默认选项。函数为ob\u end\u clean不清楚。但这不起作用(你说得对。它很干净。哈哈。这就是我累的时候会发生的事。我把它改了。但是我改成了用
ob\u get\u flush()
)=P@GabrielAlack是的,对不起,我用正确的解决方案修正了我的答案。