我已經配置swiftmailer使用文件類型來後臺打印郵件。這裏是我的swiftmailer配置Symfony - 在kernel.terminate上運行console命令
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.
我的問題是,我不能使用crontab因爲cron的可以用最少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);
}
}
什麼我想在這裏對kernel.terminate
事件運行bin/console swiftmailer:spool:send --env=dev
,不幸的是這不工作,對如何處理這個問題是能夠理解的任何提示。
謝謝。
這是什麼意思'這不起作用'? – COil
它不派遣電子郵件,而如果我回顯'$命令'並複製粘貼到終端,它的工作原理。我可以看到,即使它被執行,假脫機文件也不會被處理,通常假脫機文件被處理後會被刪除,而在我的情況下,它不會被刪除。 –
'shell_exec($ command);'的輸出是什麼,',可能是一個正確的問題? – COil