Tôi đã xem this other question. Tôi đang tìm kiếm một cách để làm những gì OP của câu hỏi đó muốn là tốt, và đó là continue processing php after sending http response, nhưng trong Symfony2.Mã chạy Symfony sau khi phản hồi đã được gửi
Tôi đã triển khai sự kiện kích hoạt sau mỗi lần kết thúc hạt nhân. Cho đến nay rất tốt, nhưng những gì tôi muốn là cho nó để bắn sau khi chấm dứt CERTAIN, trong hành động điều khiển cụ thể, ví dụ sau khi một hình thức đã được gửi đi, không phải mỗi lần duy nhất ở mọi yêu cầu. Đó là vì tôi muốn thực hiện một số tác vụ nặng vào những thời điểm nhất định và không muốn người dùng cuối chờ trang tải.
Bất kỳ ý tưởng nào tôi có thể làm điều đó?
<?php
namespace MedAppBundle\Event;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use JMS\DiExtraBundle\Annotation\Inject;
/**
* Class MedicListener
* @package MedAppBundle\EventListener
* @Service("medapp_test.listener")
* @Tag(name="kernel.event_subscriber")
*/
class TestListener implements EventSubscriberInterface
{
private $container;
private $logger;
/**
* Constructor.
*
* @param ContainerInterface $container A ContainerInterface instance
* @param LoggerInterface $logger A LoggerInterface instance
* @InjectParams({
* "container" = @Inject("service_container"),
* "logger" = @Inject("logger")
* })
*/
public function __construct(ContainerInterface $container, LoggerInterface $logger = null)
{
$this->container = $container;
$this->logger = $logger;
}
public function onTerminate()
{
$this->logger->notice('fired');
}
public static function getSubscribedEvents()
{
$listeners = array(KernelEvents::TERMINATE => 'onTerminate');
if (class_exists('Symfony\Component\Console\ConsoleEvents')) {
$listeners[ConsoleEvents::TERMINATE] = 'onTerminate';
}
return $listeners;
}
}
Cho đến bây giờ tôi đã đăng ký sự kiện vào hạt nhân. Tuy nhiên, rõ ràng điều này sẽ kích hoạt sự kiện theo từng yêu cầu. Tôi đã làm cho nó tương tự như của Swiftmailer EmailSenderListener
Thật lạ lùng khi hạt nhân phải lắng nghe mỗi lần cho sự kiện này ngay cả khi nó không được kích hoạt. Tôi thà bị sa thải chỉ khi cần thiết, nhưng không chắc chắn làm thế nào để làm điều đó.
Và nơi nào tôi thực hiện của tôi nhiệm vụ nặng nề? Tôi cần phải bắt đầu nhiệm vụ và chạy nó ngay cả sau khi phản hồi được gửi đi. Câu trả lời không được chờ cho nhiệm vụ hoàn thành. Tôi có phải 'làm công cụ' như [ở đây] (http://stackoverflow.com/a/15273676/2077972) không? Hoặc là phản hồi được gửi sau khi bất kỳ điều gì xảy ra trong hàm onTerminate() theo mặc định? –
Sự kiện chấm dứt được thiết kế để chạy sau khi phản hồi được gửi đi. Vì vậy, khi "onTerminate" được gọi là phản hồi nên đã được ra cho người dùng. –
Rõ ràng trong thực tế, điều này không phải luôn luôn như vậy. Kiểm tra câu trả lời đã chỉnh sửa của tôi. –