Symfony:用户使用网站时清除缓存和预热

Symfony : clear cache and warmup when users are using the website

使用 Symfony,当修改配置或 twig 文件时,必须清除缓存并且必须执行预热以考虑新值。

我的问题是当用户在网站上工作时,我想更新一个需要 Symfony 预热命令的文件:如果用户同时通过浏览网站查询缓存,该命令将失败。然后缓存已损坏,我需要再次 运行 清除缓存和预热命令,当用户因为网站无法正常工作而生气并一次又一次地按下 F5 按钮使这个过程无休止时...

为避免这种情况,我一直在计划维护并在缓存预热期间阻止网站可访问性。

但是,简单地改正拼写错误是一项复杂的任务,不是吗?

有没有办法清除和预热单个文件?或者有什么想法可以正确处理这个过程吗?

首先你要注册一个EventListener:

# /config/services.yaml
parameters:

    lockFilePath: "%kernel.root_dir%/../web/.lock"    

services:

    maintenance_listener:
        class: App\EventListener\MaintenanceListener
        arguments:
            - "%lockFilePath%"
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

然后是 EventListener 本身:

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class MaintenanceListener
{
    private $lockFilePath;

    public function __construct($lockFilePath)
    {
        $this->lockFilePath = $lockFilePath;
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if ( ! file_exists($this->lockFilePath)) {
            return;
        }

        $event->setResponse(
          new Response(
            'site is in maintenance mode',
            Response::HTTP_SERVICE_UNAVAILABLE
          )
        );
        $event->stopPropagation();
    }
}

因此,如果您现在在 /web 中创建一个 .lock 文件,那么您的站点将处于维护模式。 如果你想显示一个特殊的模板,你可以在EventListener中注入@templating。

对我有用,可能对你也有用。

我通常会并排放置两个版本的应用程序。只有一个连接到网络服务器。如果我必须进行任何更改,我会更新非活动版本、清除缓存、预热缓存等。然后我在 Web 服务器中切换活动版本。

这样您就可以有足够的时间进行维护,并且用户不会注意到切换。

您还可以配置 Web 服务器以允许 inactive 版本在某些内部频道中可用。这样,在您完成想要更改的内容后,您可以在开始之前查看是否一切都按预期工作(或让测试人员完成他们的工作)public。