2012-01-02 76 views
0

我在本地創建了一個小型php腳本,它在命令行中運行java應用程序。這個Java應用程序連續運行,永遠不會結束。運行時,它輸出命令行文本。這裏是代碼:運行時打印出shell_exec

<?php 
    set_time_limit(0); 
    $command = "java -Xms124M -Xmx124M -jar myapp.jar"; 
    $end = " 2>&1"; 
    $in = $command . $end; 
    $out = exec($in); 
    var_dump($out); 
?> 

我的問題是,輸出永遠不會打印,因爲應用程序永遠不會停止運行。有沒有辦法讓PHP打印出應用程序正在運行時返回的每一行? 希望我在這裏有意義(讓我知道如果我不是)。

+0

爲什麼你會產生一個預計不會結束的進程?基於服務或客戶端 - 服務器架構不會更好嗎? – Kenaniah 2012-01-02 05:00:13

+0

'java'標記不相關。用任何語言編寫的長時間運行的程序都會遇到同樣的問題。 – 2012-01-02 05:03:24

+0

好吧,如果進程永遠不會結束,那麼您需要在不同的線程中打開它,但afaik php沒有內置多線程功能。由於爲每個請求打開一個JVM本身就是過度殺毒,所以我建議你使用某種形式的進程間通信(IPC),通過執​​行如下操作來啓動程序的新實例:http://stackoverflow.com/questions/661546 /發送郵件從php到Java。增量更新站點應該通過JavaScript和其他請求來完成,而不是等待一個請求。編輯:好吧,我沒有讀「本地」的一部分,傻我 – PeterT 2012-01-02 05:03:38

回答

3

您可能想看看passthru函數和popen函數。這些應該在發生時返回輸出(儘管passthru可能會緩衝輸出)。

+0

在這種情況下,它意味着它以塊的形式發回輸出,而不是在發生時發回。 – tplaner 2012-01-02 14:57:52

0

一個解決方案是將您的進程作爲後臺進程啓動並將輸出重定向到文件。然後你可以用PHP讀取輸出文件,但是你真的不應該讓PHP像那樣運行,特別是因爲你的java進程永遠不會結束。更好的解決方案是使用AJAX輪詢讓PHP每隔幾秒鐘返回輸出文件的最新更新。