使用Symfony时,修改配置或twig文件时,必须清除缓存并且必须执行预热以考虑新值。
我的问题是当用户在网站上工作并且我想更新需要Symfony warmup命令的文件时:如果用户通过浏览网站同时查询缓存,则命令失败。然后缓存被破坏了,当用户生气时我需要再次运行clear cache和warmup命令,因为网站不能正常工作并再次点击F5按钮使这个过程无穷无尽......
为了避免这种情况,我总是计划在缓存预热期间进行维护并阻止网站访问。
但是,简单地修复错字是一项复杂的任务,不是吗?
有没有办法清除和预热单个文件?或者任何想法正确处理这个过程?
答案 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。