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

时间:2018-04-04 13:55:15

标签: php symfony caching symfony-3.4

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

我的问题是当用户在网站上工作并且我想更新需要Symfony warmup命令的文件时:如果用户通过浏览网站同时查询缓存,则命令失败。然后缓存被破坏了,当用户生气时我需要再次运行clear cache和warmup命令,因为网站不能正常工作并再次点击F5按钮使这个过程无穷无尽......

为了避免这种情况,我总是计划在缓存预热期间进行维护并阻止网站访问。

但是,简单地修复错字是一项复杂的任务,不是吗?

有没有办法清除和预热单个文件?或者任何想法正确处理这个过程?

2 个答案:

答案 0 :(得分:1)

适合我,可能适合你。

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

通过这种方式,您可以获得所需的维护时间,并且切换对您的用户来说并不明显。

您还可以配置Web服务器以允许非活动版本在某些内部通道中可用。这样,在你完成你想要改变的事情之后,你可以在你上市之前偷看一切是否按预期工作(或者让测试人员完成他们的工作)。

答案 1 :(得分:0)

首先,您必须注册一个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文件,那么您的站点处于维护模式。 如果要显示特殊模板,可以将@templating注入EventListener。