2017-04-25 43 views
2

我做了一項運行繁重任務的服務,該服務在Controller中調用。 爲了避免頁面加載時間過長,我希望返回HTTP響應並在之後運行繁重的任務。如何在服務中使用kernel.terminate事件

我讀過,我們可以使用kernel.terminate事件來做到這一點,但我不明白如何使用它。

目前我嘗試做KernelEvent監聽器:終止,但我不知道如何過濾,用於監聽器只有好的頁面上執行任務......

是否有可能添加一個函數在事件觸發時執行?然後在我的控制器中,我使用該函數來添加我的操作,Symfony稍後執行它。

感謝您的幫助。

回答

2

最後,我已經找到了如何做到這一點,我用的是此事件在我的服務,我在這裏連接監聽一個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; 
} 
相關問題