2014-12-22 1 views
1

В новом symfony2-проекте (установка, как описано here), я хотел бы начать консольный процесс как часть запроса. Приложение работает на «стандартном» ubuntu 14.04 с nginx + php-fpm.symfony/process - процесс без старта

Рассмотрим этот контроллер-код:

<?php 
namespace AppBundle\Controller; 


use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\JsonResponse; 
use Symfony\Component\Process\Process; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 

class CommandController extends Controller 
{ 
    /** 
    * @Route("/command") 
    * @return JsonResponse 
    */ 
    public function commandAction() 
    { 
     $rootDir = $this->get('kernel')->getRootDir(); 
     $env = $this->get('kernel')->getEnvironment(); 
     $commandline = $rootDir . '/console --env=' . $env . ' acme:hello --who jojo' 
     $process = new Process($commandline); 
     $process->start(); 
     return new JsonResponse(array('command' => $commandline)); 
    } 
} 

Когда я выполняю запрос/команду, я получаю мой ожидаемый результат и процесс начинается, например, Я вижу это с htop и тому подобное. Когда я снова выдаю этот запрос, я получаю ожидаемый результат, но процесс, который нужно запустить, нигде не отображается. Нет ошибок, ничего.

Перезапуск службы php5-fpm позволяет мне снова запустить один процесс с запросом, поэтому в основном мне нужно перезагрузить всю php-службу после каждого запроса. Так что это, возможно, не проблема программирования. Но я еще не знаю, честно. Проблема была описана в stackoverflow перед, Symfony2 - process launching a symfony2 command, но обходной путь с exec не работает для меня.

Есть ли у кого-нибудь ключ?

Спасибо, С уважением, Jojo

+0

как для downvote: nevermind, но поскольку это был мой первый вопрос здесь, я был бы признателен за короткую обратную связь о том, что улучшить. Спасибо :) – Jojo

ответ

5

Ваш процесс, скорее всего, умрет, прежде чем он успевает закончить свою работу. Это потому, что PHP убивает его после того, как ответ возвращается клиенту, а соединение закрыто.

Process::start() Используется для start a process asynchronously. Вам нужно либо wait() для того, чтобы закончить или проверить, если он еще закончил с isRunning():

$process->start(); 

$process->wait(function ($type, $buffer) { 
    // do sth while you wait 
}); 

В качестве альтернативы, используйте Process::run() вместо Process:start().

Используйте очереди сообщений, если вы хотите обработать что-то в фоновом режиме.

+0

Спасибо за вашу помощь. Да, асинхронно запускается процесс, и я думаю, вы правы, что fpm просто убивает связанный процесс, когда запрос завершен. Я действительно хотел бы понять, почему он работает ровно за 1 раз до того, как это произойдет. В любом случае, реализация всего этого через очередь сообщений - это действительно решение, так что спасибо. – Jojo