Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我只能捕获Node.js脚本的第一个输出行_Javascript_Php_Windows_Node.js - Fatal编程技术网

Javascript 我只能捕获Node.js脚本的第一个输出行

Javascript 我只能捕获Node.js脚本的第一个输出行,javascript,php,windows,node.js,Javascript,Php,Windows,Node.js,我已经为Node.js编写了一个简单的测试脚本: console.log(“第1行stdout”); 控制台日志(“第2行标准输出”); 控制台日志(“第3行标准输出”); 控制台错误(“第1行标准”); 控制台错误(“第2行标准”); 控制台错误(“第3行标准”); 过程.退出(33); 我需要从PHP脚本捕获其完整输出,但无论我如何尝试,我只获得每个流的第一行: var_dump(`node test.js 2>&1`); exec('node test.js 2>&1',$output)

我已经为Node.js编写了一个简单的测试脚本:

console.log(“第1行stdout”);
控制台日志(“第2行标准输出”);
控制台日志(“第3行标准输出”);
控制台错误(“第1行标准”);
控制台错误(“第2行标准”);
控制台错误(“第3行标准”);
过程.退出(33);
我需要从PHP脚本捕获其完整输出,但无论我如何尝试,我只获得每个流的第一行:

var_dump(`node test.js 2>&1`);
exec('node test.js 2>&1',$output);
变量转储(输出);
$descriptorspec=数组(
1=>数组('pipe','w'),//stdout
2=>数组('pipe','w'),//stderr
);
$process=proc_open('node test.js',$descriptorspec,$pipes);
变量转储(流获取内容($pipes[1]);
变量转储(流获取内容($pipes[2]);
过程结束($过程);
string(30)”行#1标准输出
第1行标准
"
阵列(2){
[0]=>
字符串(14)“第1行标准输出”
[1]=>
字符串(14)“第1行标准”
}
字符串(15)“行#1标准输出
"
字符串(15)“行#1标准
"
我是否缺少
控制台
对象的一些基本概念

编辑:严格来说,这不是一个PHP问题;命令行中也会发生同样的情况:

C:\test>node test.js 2>&1 | sort /r
Line #1 stdout
Line #1 stderr

它一定是一个Node.js,我还没有整理好。

我不确定您使用的是哪种代码编辑器,但您可能需要检查行的结尾。例如,在Sublimitext 3中,您可以选择节点test.js(并可能转义该字符串node\test.js),并确保它们是Unix的行尾。这将通过查看->行结束。

这显然是Node.js中的一个已知问题。甚至还有:

退出

更换process.exit,确保stdio完全排空 在离开之前

长话短说,如果在Windows上调用process.exit, 当管道重定向标准输出或 斯特德尔。本模块尝试通过等待解决此问题 直到这些溪流完全排干之后 调用process.exit

有关更多参考,请参阅

使用此软件包,替换此软件包:

process.exit(33);
。。。为此:

var exit = require('exit');
exit(33);

。。。产生预期的行为:在进程结束之前刷新控制台输出。

仅供参考,这仅在Windows上是一个问题,但我只是在Linux(确切地说是Oracle Linux 7.4)和节点8.11.1上遇到了这个问题

我的程序产生723行输出,输出到终端或重定向到文件,但如果管道传输到less或tee,则在333行被截断(导致大量调试时间浪费)


提到的退出方案为我解决了这个问题

CRLF会对内容产生任何影响吗?请记住,PHP是异步执行此过程的,并且您似乎没有试图确定执行是否已完成。您可能希望使用's
eof
检查进程是否关闭了其输出管道。@Sammitch-也许这就是问题所在:命令结束并生成状态代码,而仍有挂起的缓冲输出(这可能吗?);我觉得这有点道理。但是我刚刚尝试了
util.puts()
,这是,我仍然只得到了第一行。我已经尝试过了(我不再说这或那是不可能的),但没有任何改变。事实上,
console.log()
console.error()
util.puts()
会自动插入新行。。。如果执行
console.log(“一\nt两\ntree”)
操作,我会得到三条输出行(但只有来自第一个
console.log()
实例的输出行)。