2013-05-15 159 views
3

我想在PHP中執行系統命令,並捕獲那些輸出涵蓋多行的那些命令的輸出。我正在使用exec(),但它似乎只爲單行生成輸出的命令返回一個值。如何捕獲PHP執行的命令的多行輸出?

例如,如果我在命令行中運行日期,我得到:

Wed May 15 15:07:32 EST 2013 

正如預期的那樣,如果我跑從PHP這個命令使用該執行exec ...

exec("date", $exec_results); 

...然後$ exec_results的值變爲...

Array ([0] => Wed May 15 15:07:32 EST 2013) 

但是,當我從命令行運行時,我得到這...

real 0m0.000s 
user 0m0.000s 
sys 0m0.000s 

...但是當我做這從PHP ...

exec("time", $exec_results); 

... $ exec_results的值爲空:

Array() 

我不實際上需要在我的應用程序中運行日期或時間,但這些僅僅是命令行中的單行輸出與多行輸出如何改變PHP返回的例子。

的文件說:

如果輸出參數存在,則該指定的數組將被填充來自指令輸出的每一行。

那麼,爲什麼$ exec_results數組沒有被命令行中運行time命令時看到的所有行填充?

筆記 - 我已經運行命令行條目作爲apache用戶來排除特權。

回答

1

我改變了我的職位工作的解決方案:

使用UNIX的「腳本」命令來獲得結果。 您肯定必須刪除臨時日誌文件的「額外行數」。

exec('script -c "time" /tmp/yourfile.txt'); 
$result = file('/tmp/yourfile.txt'); 
var_dump($result); 

你應該總是把一個完整路徑臨時文件,任何地方,你把它

這就是它!

+0

感謝您的想法 - 我試過了shell_exec但不幸的是發現它也沒有返回到PHP對於其中CLI輸出多行的命令。仍然困惑... – Dan

+0

要小心,實際上與cron和寫入文件的問題是完全一樣的問題,如果該命令不寫入控制檯它不能被重定向器捕獲:#time> file.txt將不會把結果寫入文件 –

+0

謝謝Ph.T - 你是對的,不適合時間。它確實適用於戴爾OMSA應用程序的命令(這是我想用PHP捕獲的)。所以在這個例子中,屏幕上顯示的內容可以移動到文件中,但PHP仍然只是獲得一個空數組。我的解決方法是有效的,但是我們無法找到爲什麼PHP能夠獲取文本是一種遺憾...... – Dan

7

這應該爲你工作

ob_start(); 
passthru("ls -la"); 
$dat = ob_get_clean(); 
+0

謝謝 - 這對'ls -la'有效,但不是時間,或者我試圖捕獲的Dell OMSA程序的多線輸出。不知道有什麼區別...我會繼續研究。謝謝! – Dan

+0

你確定這些命令寫入標準輸出,而不是stderr – Orangepill

+0

我檢查了沒有錯誤使用exec()的第三個參數,所以這應該意味着輸出作爲標準輸出,儘管@ Ph.T的也許是輸出只有屏幕。通過讓CRON作業運行命令並將數據放入文件中,我找到了另一種解決方案。 PHP只會查找文件。 – Dan