我刚刚注意到,如果在打开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();