2017-12-27 20 views
0

プロセスコンポーネントを使用してコントローラからコンソールコマンドを実行しようとしていますが、動作しません。コントローラからコンソールコマンドを実行しているSymfony3コンソール

これは私のコードです:

 $process = new Process('php bin/console mycommand:run'); 
    $process->setInput($myArg); 
    $process->start(); 

私も試してみました:

$process = new Process('php bin/console mycommand:run ' . $myArg) 
    $process->start(); 

私が使用して私のコマンドを実行します。

php bin/console mycommand:run my_argument 

あなたは私が間違っているのを教えてもらえますか?

+0

「動作しません」とはどういう意味ですか?エラーメッセージはありますか? –

答えて

1

私は問題が経路だと思います。とにかく、Processを使ってSymfonyコマンドを呼び出さないでください。コンソールコンポーネントはコマンドを呼び出すことができます。コントローラ内。ドキュメントから

例:

// src/Controller/SpoolController.php 
namespace App\Controller; 

use Symfony\Bundle\FrameworkBundle\Console\Application; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Console\Input\ArrayInput; 
use Symfony\Component\Console\Output\BufferedOutput; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\KernelInterface; 

class SpoolController extends Controller 
{ 
    public function sendSpoolAction($messages = 10, KernelInterface $kernel) 
    { 
     $application = new Application($kernel); 
     $application->setAutoExit(false); 

     $input = new ArrayInput(array(
      'command' => 'swiftmailer:spool:send', 
      // (optional) define the value of command arguments 
      'fooArgument' => 'barValue', 
      // (optional) pass options to the command 
      '--message-limit' => $messages, 
     )); 

     // You can use NullOutput() if you don't need the output 
     $output = new BufferedOutput(); 
     $application->run($input, $output); 

     // return the output, don't use if you used NullOutput() 
     $content = $output->fetch(); 

     // return new Response(""), if you used NullOutput() 
     return new Response($content); 
    } 
} 

あなたはコードが常に動作することを確信しているこの方法を使用します。 PHPがセーフモード(execなどがオフになっている)のときProcessコンポーネントは役に立たない。さらに、パスやその他のことを気にする必要がない場合は、「手動で」コマンドを呼び出すこともできます。

コントローラhereからのコマンドの呼び出しについて詳しく読むことができます。

+0

私はこの方法を前に試してみましたが、うまくいきましたが、実行後にコマンドを停止したいと思っていました。プロセスでは、私はちょうどどこかでPIDを取得し、その後プロセスを終了することができます。もし私がこのコマンドをkillすることができれば、この解決策の私の選択肢は何か、私はpcntl_signalsで可能だと聞きましたが、私の前のスレッドで見られるように - https://stackoverflow.com/questions/47941237/symfony3-command- pcntl-doesnt-works それは私のために働いていませんでした。 – SakuragiRokurota

+0

@SakuragiRokurotaあなたの最善の策はメッセージキューを使用しています。この方法では、コントローラはメッセージをキューに送信するだけで、コマンド処理はHTTP要求から切り離されます。 – svgrafov

関連する問題