2012-12-10 102 views
7

Symfony2使開發人員能夠創建自己的命令行命令。它們可以從命令行執行,也可以從控制器執行。據官方Symfony2的文檔,這是可以做到這樣的:如何在後臺運行自定義Symfony2命令

protected function execute(InputInterface $input, OutputInterface $output) 
{ 
    $command = $this->getApplication()->find('demo:greet'); 

    $arguments = array(
     ... 
    ); 

    $input = new ArrayInput($arguments); 
    $returnCode = $command->run($input, $output); 

} 

但在這種情況下,我們等待命令完成它的執行並返回的返回碼。

我怎樣才能從控制器的執行命令而不用等待它完成執行呢?

換句話說這將是等效的

$ nohup php app/console demo:greet & 
+0

我們最近遇到了同樣的問題,並使用[RabbitMQBundle]解決它(https://github.com/videlalvaro/RabbitMqBundle) – Squazic

回答

5

根據,我不認爲有這樣一個選項的文檔:http://api.symfony.com/2.1/Symfony/Component/Console/Application.html

但是對於你想達到什麼目的,我想您應該使用過程組件代替:

use Symfony\Component\Process\Process; 

$process = new Process('ls -lsa'); 
$process->run(function ($type, $buffer) { 
    if ('err' === $type) { 
     echo 'ERR > '.$buffer; 
    } else { 
     echo 'OUT > '.$buffer; 
    } 
}); 

而且正如文檔中提到的「如果您希望能夠獲得一些真實的反饋只需將一個匿名函數傳遞給run()方法「。

http://symfony.com/doc/master/components/process.html

+1

沒有詳細調查細節,我使用'$ process-> start ()'$ process-> run()'instaed' – malloc4k

+1

看起來像run()調用start(),然後wait(),所以在你的情況下你是對的,你應該使用start。 [鏈接](https://github.com/symfony/Process/blob/master/Process.php) – cheesemacfly

6

從文檔是更好地利用start()方法,而不是運行(),如果你想創建一個後臺進程。如果使用run()創建進程,process_max_time可能會終止進程

「您可以使用run()來執行進程,而不必使用run():run()阻塞並等待進程完成,start()創建一個後臺進程。「

+0

你能詳細說明process_max_time嗎?除了您的帖子,Google不會爲此返回任何相關結果。 – gadelat

相關問題