(Linux CLI PHP)捕获CURL';s在执行过程中对文件的详细输出


(Linux CLI PHP) Capturing CURL's verbose output to file during execution

我刚刚注意到,如果在打开CURLOPT_VERBOSE选项的情况下运行使用curl的命令行php脚本,则无法捕获输出。。。

示例:

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

所有的PHP输出都将进入日志文件,但curl的输出仍然会显示在屏幕上。

如何将PHP输出和curl输出都捕获?

    $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的手册页面上写着:

URLOT_VERBOSE TRUE输出详细信息。将输出写入STDERR或使用CURLOPT_STDERR指定的文件。

因此,为CURLOPT_STDERR指定STDOUT将起作用:

curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, STDOUT);

原始答案

检查您是否也在设置CURLOPT_RETURNTRANSFER

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

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...

如果您正在寻找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();