Процесс Symfony2 не дает обратной связи в режиме реального времени

моя идея состоит в том, чтобы запустить сервер Minecraft с классом процесса Symfony2 и хотите дать мне обратную связь в режиме реального времени. Итак, как описано в разделе Process поваренной книги, я пробую следующий код:

$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-data мог запускать команду java.

Сервер запускается в фоновом режиме, но теперь моя проблема в том, что я не получаю никаких выходных данных в реальном времени. Только если я выключу (или убью) серверный процесс minecraft, я получу вывод.

Любые предложения, как получить вывод в реальном времени?


person F481    schedule 09.12.2012    source источник
comment
Куда идет вывод? Если это файл, то вы должны прочитать содержимое этого файла из действия и вернуть его, а затем периодически вызывать его из ajax, чтобы он был на вашей странице.   -  person jaudette    schedule 09.12.2012
comment
Рабочее решение будет перенаправлять вывод на стандартную ошибку. Например, это будет работать для вас: fprintf(STDERR, ERR › %s, $buffer); Но я не уверен, что это лучшее решение   -  person Cyprian    schedule 09.12.2012
comment
нет, это не работает для меня. Я думаю, я напишу задачу symfony, которая запускает сервер minecraft (вывод на консоль работает)   -  person F481    schedule 12.12.2012
comment
У меня та же проблема, локальная в OSX, команда запускается для тайм-аута простоя ... а в Ubuntu процесс запускается и не закрывается после выполнения. Любые решения?   -  person René Höhle    schedule 28.07.2015


Ответы (1)


Вместо вызова метода run() вам следует попробовать метод start():

$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

person cheesemacfly    schedule 14.12.2012
comment
Ни run(), ни start() у меня не работают. В обоих случаях обратные вызовы выполняются только после завершения процесса. - person Davincho; 02.01.2014
comment
РЕДАКТИРОВАТЬ: Хорошо, это похоже на ошибку Windows, когда fread блокирует дальнейшее выполнение. Process::start работает неправильно, так как любой вызов метода, который считывает каналы, блокируется, для получения более подробной информации см. github.com/symfony/symfony/issues/9755 - person Davincho; 02.01.2014