Я настроил swiftmailer для отправки сообщений электронной почты с использованием типа файла. вот моя конфигурация swiftmailerSymfony - запустить консольную команду на kernel.terminate
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
spool:
type: file
path: "%kernel.root_dir%/../var/spool"
Когда я отправляю любые электронные письма, он отлично бланширует. После этого я запускаю следующую команду для отправки писем.
bin/console swiftmailer:spool:send --env=dev
Согласно Symfony documentation
the console command should be triggered by a cron job or scheduled task and run at a regular interval.
Моя проблема, я не могу использовать кронтаб, потому что хрон может быть сконфигурирован с минимумом 1-минутного интервала, который я не могу себе позволить. Я хочу использовать фоновый процесс с немедленным выполнением после того, как ответ будет отправлен обратно в браузер, что минимизирует выполнение катушек до минимума.
Я попытался решить эту проблему, создав класс слушателя событий и слушать kernel.terminate
, и выполнить команду, используя shell_exec
или exec
функцию, вот код для справки.
app.kernel.terminate.listener:
arguments: ["@kernel"]
class: AppBundle\EventListener\KernelTerminateListener
tags:
- { name: kernel.event_listener, event: kernel.terminate }
Вот мой EventListener класс
<?php
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Cocur\BackgroundProcess\BackgroundProcess;
class KernelTerminateListener
{
protected $kernel;
protected $console;
public function __construct($kernel)
{
$this->kernel = $kernel;
$this->console = $this->kernel->getRootDir().'/../bin/console ';
}
public function onKernelTerminate(PostResponseEvent $event)
{
$command = $this->console.'swiftmailer:spool:send --env='.$this->kernel->getEnvironment();
shell_exec($command);
}
}
То, что я пытаюсь здесь, чтобы запустить bin/console swiftmailer:spool:send --env=dev
на kernel.terminate
случае, к сожалению, это не работает, любой намек о том, как подойти к этой проблеме ценится.
спасибо.
Что означает «это не работает»? – COil
Он не отправляет электронное письмо, тогда как if echo '$ command' и копирует его в терминал, он работает. Я вижу, что даже если он выполняется, файлы спула не обрабатываются, обычно файлы спула удаляются, если они обрабатываются, а в моем случае они не удаляются. –
Что такое вывод 'shell_exec ($ command);', может быть правильной проблемой? – COil