2014-12-22 92 views
1

在新的symfony2-project(安裝描述爲here)中,我想啓動一個控制檯進程作爲請求的一部分。該應用程序使用nginx + php-fpm在「標準」ubuntu 14.04盒子上運行。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服務。所以這可能不是編程問題。但我還不確定,誠實。 此問題在之前的計算器上描述過,Symfony2 - process launching a symfony2 command,但是exec的解決方法對我來說不起作用。

有人有線索嗎?

感謝,問候, 喬喬它設法完成工作之前

+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