我写了一个简单的测试脚本的Node.js:我只能捕捉的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特殊性,我还没有整理出来。
CRLF会对内容有任何影响吗? –
请记住,PHP正在异步执行此过程,并且您似乎未尝试确定执行是否已完成。你可能想利用['stream_get_meta_data()'](http://us2.php.net/manual/en/function.stream-get-meta-data.php)的'eof'来检查过程是否关闭了输出管道。 – Sammitch
@Sammitch - 也许这就是问题所在:当仍然存在未决的缓冲输出时,命令结束并生成状态码(甚至有可能?); ['console' docs](http://nodejs.org/docs/latest/api/console.html#console_console)建议有这方面的内容。但我刚刚尝试了'util.puts()',它[据说是同步](http://nodejs.org/docs/latest/api/util。html#util_util_puts),我仍然只有第一行。 –