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。
使用 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。