2012-12-09 6 views
3

Моя идея - запустить сервер minecraft с Symfony2 Process Class и хочу дать мне обратную связь в режиме реального времени. Таким образом, как описано в Process cookbook part, я стараюсь следующий код:Symfony2 Процесс не дает обратной связи в режиме реального времени

$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

нет, это не работает для меня. Я думаю, что я напишу задачу symfony, которая запускает сервер minecraft (вывод на консоль работает) – 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

EDIT: Это похоже на ошибку Windows, где fread блокирует дальнейшее выполнение. «Процесс :: старт работает некорректно, потому что любой вызов метода, который читает каналы, блокируется», более подробно см. Https://github.com/symfony/symfony/issues/9755 – Davincho