2014-02-21 38 views
1

我寫了一個簡單的測試腳本的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特殊性,我還沒有整理出來。

+0

CRLF會對內容有任何影響嗎? –

+1

請記住,PHP正在異步執行此過程,並且您似乎未嘗試確定執行是否已完成。你可能想利用['stream_get_meta_data()'](http://us2.php.net/manual/en/function.stream-get-meta-data.php)的'eof'來檢查過程是否關閉了輸出管道。 – Sammitch

+0

@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),我仍然只有第一行。 –

回答

1

這顯然是Node.js中的一個已知問題。甚至還有a package to fix it

出口

一種process.exit更換,以確保標準輸入輸出都退出之前完全耗盡 。

要長話短說,如果在Windows上調用process.exit, 腳本輸出在管道重定向標準輸出或 stderr時經常被截斷。此模塊試圖通過等待 來解決此問題,直到這些流在實際調用process.exit之前已完全耗盡。

請參閱Node.js issue #3584作進一步參考。

利用這種包,這取代:

process.exit(33); 

...與此:

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

...產生預期的行爲:該過程結束之前控制檯輸出被刷新。

0

我不確定你正在使用哪個代碼編輯器,但你可能想檢查行結束符。例如,在Sublimetext 3中,您可以選擇節點test.js(也可以轉義該字符串節點\ test.js)並確保它們是Unix行尾。這將通過查看 - >行結束。

+0

我試過了(我不再說這個或那是不可能的),但沒有任何改變。事實上,通過'console.log()','console.error()','util.puts()'自動插入新的行......如果我做了'console.log(「One \ nTwo \ nThree」 )'我得到三條輸出行(但只有那些來自第一個'console.log()'實例的行)。 –