我已经为Node.js写了一个简单的testing脚本:
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脚本中捕获完整的输出,但不pipe我尝试什么,我只能得到每个stream的第一行:
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的特殊性,我还没有整理出来。
这显然是Node.js中的一个已知问题。 甚至有一个包来解决它 :
出口
process.exit的替代,确保stdio在退出之前完全耗尽。
长话短说,如果在Windows上调用process.exit,那么在管道重定向stdout或stderr时,脚本输出通常会被截断。 这个模块试图通过等到这些流完全耗尽之前,实际调用process.exit来解决这个问题。
请参阅Node.js问题#3584以作进一步参考。
用这样的包装,取代这个:
process.exit(33);
… 有了这个:
var exit = require('exit'); exit(33);
…产生预期的行为:在过程结束之前刷新控制台输出。
我不确定你正在使用哪个代码编辑器,但是你可能想要检查行结束符。 例如,在Sublimetext 3中,可以选择节点test.js(也可以转义字符串节点\ test.js),并确保它们是Unix行尾。 这将通过查看 – >行结束。