我为Node.js编写了一个简单的测试脚本:
console.log("Line #1 stdout");
console.log("Line #2 stdout");
console.log("Line #3 stdout");
console.error("Line #1 stderr");
console.error("Line #2 stderr");
console.error("Line #3 stderr");
process.exit(33);
我需要从PHP脚本中捕获其完整输出,但无论我尝试什么,我只获得每个流的第一行:
var_dump(`node test.js 2>&1`);
exec('node test.js 2>&1', $output);
var_dump($output);
$descriptorspec = array(
1 => array('pipe', 'w'), // stdout
2 => array('pipe', 'w'), // stderr
);
$process = proc_open('node test.js', $descriptorspec, $pipes);
var_dump(stream_get_contents($pipes[1]));
var_dump(stream_get_contents($pipes[2]));
proc_close($process);
string(30) "Line #1 stdout
Line #1 stderr
"
array(2) {
[0]=>
string(14) "Line #1 stdout"
[1]=>
string(14) "Line #1 stderr"
}
string(15) "Line #1 stdout
"
string(15) "Line #1 stderr
"
我是否遗漏了console
对象的一些基本概念?
编辑:这不是严格意义上的PHP问题;在命令行中也是如此:
C:\test>node test.js 2>&1 | sort /r
Line #1 stdout
Line #1 stderr
它必须是我尚未整理的Node.js特殊性。
答案 0 :(得分:1)
这显然是Node.js中的一个已知问题。甚至有a package to fix it:
退出强>
替换process.exit,确保stdio完全耗尽 在退出之前。
简而言之,如果在Windows上调用process.exit, 管道重定向stdout或时,脚本输出经常被截断 标准错误。此模块尝试通过等待来解决此问题 直到那些溪流实际上已完全耗尽 调用process.exit。
有关详细信息,请参阅Node.js issue #3584。
使用这样的包,替换它:
process.exit(33);
......用这个:
var exit = require('exit');
exit(33);
...产生预期的行为:在进程结束之前刷新控制台输出。
答案 1 :(得分:1)
仅供参考,这只是在Windows上出现问题,但我刚刚在Linux(确切地说是Oracle Linux 7.4)上遇到过Node 8.11.1。
我的程序正在生成723行输出,输出到终端或重定向到文件,但如果通过管道传输到更少或tee(在导致大量浪费的调试时间),则会在第333行截断。
提到的退出包解决了我。
答案 2 :(得分:-1)
我不确定您使用的代码编辑器,但您可能需要检查行结尾。例如,在Sublimetext 3中,您可以选择节点test.js(并且可能转义该字符串node \ test.js)并确保它们是Unix行结尾。那将是通过视图 - >线路结束。