2017-12-27 59 views
0

프로세스 구성 요소를 사용하여 컨트롤러에서 콘솔 명령을 실행하려고하는데 작동하지 않습니다.컨트롤러에서 콘솔 명령을 실행하는 Symfony3 콘솔

php bin/console mycommand:run my_argument 

가 내가 뭘 잘못 말해 수 :

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

내가 사용하여 내 명령을 실행 : 나는 또한 시도

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

:

이 내 코드?

+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를 검색하고 나중에 프로세스를 종료 할 수 있습니다. 명령을 죽일 수 있다면이 솔루션으로 내 옵션이 무엇인지, 나는 pcntl_signals로 가능하다고 들었지만 내 이전 스레드에서 볼 수 있듯이 - https://stackoverflow.com/questions/47941237/symfony3-command- pcntl-doesnt-works 그것은 나를 위해 일하지 않았다. – SakuragiRokurota

+0

@SakuragiRokurota 최선의 방법은 메시지 대기열을 사용하는 것입니다. 이렇게하면 컨트롤러가 메시지를 대기열로 보내고 명령 처리가 HTTP 요청과 분리됩니다. – svgrafov