2012-12-09 57 views
3

我的想法是啓動一個使用Symfony2 Process Class的我的世界服務器,並且想要實時給我提供反饋。所以,就像在Process cookbook part描述,我嘗試下面的代碼:Symfony2 Process doest't無法提供實時反饋

$process = new Process('sudo java -jar -Xms512M -Xmx1G ../server/minecraft_server.jar'); 
    $process->setTimeout(null); 
    $process->run(function ($type, $buffer) { 
     if ('err' === $type) { 
      echo 'ERR > '.$buffer; 
     } else { 
      echo 'OUT > '.$buffer; 
     } 
    }); 

由於與Apache2的用戶我修改sudoers的一些權限問題的文件與此:www-data ALL = (myspecialUser) NOPASSWD: /usr/bin/java
所以www數據的用戶可以運行java命令。

服務器在後臺啓動,但我的問題是現在我沒有得到任何實時輸出。只有當我關閉(或殺死)Minecraft服務器進程時,我纔會得到輸出結果。

如何獲得實時輸出的任何建議?

+0

哪裏是輸出去?如果它是一個文件,那麼你應該從一個動作中讀取文件內容並返回它,然後定期從ajax調用它到你的頁面上。 – jaudette

+0

工作解決方案將重定向輸出爲標準錯誤。例如,這將適用於你:fprintf(STDERR,「ERR>%s」,$ buffer);但我不確定它是否是最佳解決方案 – Cyprian

+0

不,這對我不起作用。我想我會寫一個啓動minecraft服務器的symfony任務(控制檯上的輸出正在工作) – F481

回答

0

而不是調用run()方法中,你應該開始嘗試()之一:

$process = new Process('sudo java -jar -Xms512M -Xmx1G ../server/minecraft_server.jar'); 
$process->setTimeout(null); 
$process->start(function ($type, $buffer)); 

echo 'OUT >' . $process->getOutput(); 

http://api.symfony.com/master/Symfony/Component/Process/Process.html#method_start

http://api.symfony.com/master/Symfony/Component/Process/Process.html#method_getOutput

+2

run()和start()都不適用於我。在這兩種情況下,回調都會執行,直到過程結束。 – Davincho

+2

編輯:好吧它看起來像一個Windows錯誤,其中fread阻止進一步執行。 「Process :: start無法正常工作,因爲任何對讀取管道的方法的調用都會阻塞」,有關詳細信息,請參閱https://github.com/symfony/symfony/issues/9755 – Davincho