我寫了一個簡單的測試腳本的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),我仍然只有第一行。 –