J'ai configuré swiftmailer pour spouler des emails en utilisant le type de fichier. voici ma config swiftmailerSymfony - lance la commande console sur kernel.terminate
swiftmailer:
transport: "%mailer_transport%"
host: "%mailer_host%"
username: "%mailer_user%"
password: "%mailer_password%"
spool:
type: file
path: "%kernel.root_dir%/../var/spool"
Lorsque j'envoie des e-mails, il est parfaitement spoulé. Je cours la commande suivante pour expédier des email par la suite.
bin/console swiftmailer:spool:send --env=dev
Selon Symfony documentation
the console command should be triggered by a cron job or scheduled task and run at a regular interval.
Mon problème est, je ne peux pas utiliser crontab car Cron peut être configuré avec un minimum d'intervalle de 1 minute que je ne peux pas se permettre. Je veux utiliser le processus d'arrière-plan avec une exécution immédiate après que la réponse est renvoyée au navigateur, ce qui minimise l'exécution des spools au strict minimum.
je tenté de résoudre ce problème en créant une classe d'écouteur d'événements et d'écouter kernel.terminate
, et exécuter la commande en fonction shell_exec
ou exec
, voici le code de référence.
app.kernel.terminate.listener:
arguments: ["@kernel"]
class: AppBundle\EventListener\KernelTerminateListener
tags:
- { name: kernel.event_listener, event: kernel.terminate }
Voici ma EventListener classe
<?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);
}
}
Ce que je suis en train ici est d'exécuter bin/console swiftmailer:spool:send --env=dev
sur l'événement kernel.terminate
, malheureusement cela ne fonctionne pas, aucune indication sur la façon d'aborder ce problème est apprécié.
Merci.
Que signifie «cela ne fonctionne pas»? – COil
Il ne distribue pas l'email, alors que si je fais écho '$ command' et copiez le coller dans le terminal, cela fonctionne. Je peux voir que même si elle est exécutée, les fichiers spoule ne sont pas traités, généralement les fichiers spoule sont supprimés si elle est traitée, et dans mon cas, elle ne supprime pas. –
Quelle est la sortie de 'shell_exec ($ commande);', peut-être un bon problème? – COil