8

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);

}

ただし、この状況では、コマンドの実行が終了してリターン コードが返されるまで待ちます。

controller から、実行が完了するのを待たずにコマンドをバックグラウンドにフォークして実行するにはどうすればよいですか?

言い換えれば、同等のもの

$ nohup php app/console demo:greet &
4

2 に答える 2

7

ドキュメントから、バックグラウンド プロセスを作成する場合は、run() の代わりに start() を使用することをお勧めします。run() でプロセスを作成すると、process_max_time によってプロセスが強制終了される可能性があります。

「run() を使用してプロセスを実行する代わりに、start() を実行できます。run() はブロックされ、プロセスが終了するのを待ちます。start() はバックグラウンド プロセスを作成します。」

于 2013-06-20T09:33:58.880 に答える
6

ドキュメントによると、そのようなオプションはないと思います: 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

于 2012-12-10T15:37:16.607 に答える