2017-04-25 1 views
2

무거운 작업을 실행하는 서비스를 수행하며이 서비스는 컨트롤러에서 호출됩니다. 너무 긴 페이지로드를 방지하기 위해 HTTP 응답을 반환하고 이후 무거운 작업을 실행하고 싶습니다.어떻게 사용합니까? kernel.terminate 서비스에서 이벤트 사용

우리는 kernel.terminate 이벤트를 사용하여 읽을 수는 있지만 사용법을 이해하지 못한다고 읽었습니다.

가 그것을 가능 ... 종료하지만 난 리스너는 좋은 페이지에서 작업을 실행하기위한 필터링하는 방법을 모른다 : 순간

나는 KernelEvent에 리스너를 수행하려고 이벤트가 트리거 될 때 실행할 함수를 추가 하시겠습니까? 그런 다음 내 컨트롤러에서 함수를 사용하여 액션을 추가하고 Symfony는 나중에 실행합니다.

도움 주셔서 감사합니다.

답변

2

마지막으로, 나는 나의 서비스로는 EventDispatcher를 사용하여, 그것을 수행하는 방법을 찾아 봤는데, 여기에 리스너에게 PHP 폐쇄 연결 : http://symfony.com/doc/current/components/event_dispatcher.html#connecting-listeners

use Symfony\Component\EventDispatcher\Event; 
use Symfony\Component\EventDispatcher\EventDispatcherInterface; 
use Symfony\Component\HttpKernel\KernelEvents; 

class MyService 
{ 
    private $eventDispatcher; 

    public function __construct(TokenGenerator $tokenGenerator, EventDispatcherInterface $eventDispatcher) 
    { 
    $this->tokenGenerator = $tokenGenerator; 
    $this->eventDispatcher = $eventDispatcher; 
    } 

    public function createJob($query) 
{ 
    // Create a job token 
    $token = $this->tokenGenerator->generateToken(); 

    // Add the job in database 
    $job = new Job(); 
    $job->setName($token); 
    $job->setQuery($query); 

    // Persist the job in database 
    $this->em->persist($job); 
    $this->em->flush(); 

    // Call an event, to process the job in background 
    $this->eventDispatcher->addListener(KernelEvents::TERMINATE, function (Event $event) use ($job) { 
     // Launch the job 
     $this->launchJob($job); 
    }); 

    return $job; 
} 
관련 문제