在生产环境中处理Symfony的缓存

6
我有一个Symfony2网站正在生产环境中进行测试。我已经清除了它的缓存,因为我已经做了一些修改并且可能还会进行更多的修改,但是存在一个小问题:
当缓存被清除并且在此期间我想要预热它时,访问网站的某个人重建了缓存。这会创建一个小问题,因为缓存正在构建中,但不完全构建,因为删除仍在进行中,缓存的一半被删除。
之后发生的情况是,缓存被构建,但只构建了其中的一部分。Symfony认为缓存已经完全构建,并且在不尝试再次构建它的情况下运行,但它在半构建的缓存上运行。删除过程有点长(约15秒),因此在此期间没有人必须通过访问网站来创建缓存。
要么是缓存已经完全构建,覆盖了旧缓存,系统将这些新文件视为旧文件,删除其中的一部分,而其他一些文件则保留。不太确定,我不知道如何检查这一点。
例如,我收到的错误之一是:
The directory "D:\xampp\htdocs\med-app\app\app\cache\dev/jms_diextra/metadata" does not exist.

如果我不使用这个bundle,那么我将会从Doctrine中获得另一个缓存问题。这个问题在每次网站访问时都会出现,直到我再次删除缓存,而没有任何人访问网站。它完全阻止了对网站的访问,并使其无法正常工作。
此外,预热需要一段时间。如果在缓存正在预热时有人访问网站,会不会也产生冲突呢?
如何处理这个问题?我需要关闭Apache服务、清除和预热缓存,然后重新启动Apache吗?在生产环境中,这是如何处理的?
编辑: 我发现了一些有趣的东西。当我删除cache/prod文件夹时,会出现这个bug。如果我只删除文件夹中的内容而不删除文件夹本身,似乎就不会出现这个bug。我想知道为什么。

由于您手动清除缓存,因此刷新也需要手动完成,否则请参考@johnSmith的评论以使其在较短时间内自动刷新或完全禁用它。 - Anil
我无法在Windows上使用xampp中的“rm”。 - George Irimiciuc
另外,如果在此同时有人进入网站会发生什么?它也会出现错误吗?我不认为它是纯粹即时的,尽管比其他方式更快。 - George Irimiciuc
如果您手动创建缺失的目录,该错误是否已解决? - chalasr
我为什么要手动创建它? 它会自己创建。 - George Irimiciuc
显示剩余2条评论
2个回答

4
通常,在生产环境下,如果要进行更新或清除缓存等操作,将网站锁定到维护模式是一个很好的实践。有时,Web托管服务会为您处理此选项,或者可以使用命令行方便地处理维护,例如一个很棒的捆绑包
这样,您就可以安全地删除缓存,并确保没有人访问页面并不正确地重新生成缓存。

据我所知,Lexik 还提供了一个维护捆绑包,你觉得那个也值得推荐吗?不管怎样,访问由这个捆绑包生成的维护页面是否会尝试从缓存中读取或写入数据呢?因为那仍然无法解决问题。 - George Irimiciuc
我没有使用过lexik的bundle。CorleyMaintenanceBundle有两种模式,硬锁和软锁。你正在寻找在apache/nginx级别上工作的硬锁。软锁仍然可以访问缓存。 - Teo.sk

3
通常情况下,如果你需要清除Symfony缓存,那么意味着你正在升级到一个新版本。因此,不仅需要清除缓存,还可能需要转储资产和执行其他任务。在这种情况下,我过去做过的非常好的方法是将每个生产发布版本视为其自己的版本并保存在自己的文件夹中。因此,当你安装新版本时,你可以不连接到web服务器,然后在完成后只需更改web服务器指向新版本即可。另外的好处是,如果出了问题需要回滚,只需立即链接回之前的版本。
例如,假设你的Apache配置始终将DocumentRoot指向特定位置:
DocumentRoot /var/www/mysite/web

您可以将该根目录设置为最新版本的符号链接:
/var/www/mysite/web -> /var/www/versions/1.0/web

现在假设你有要安装的网站版本1.1,只需将其安装到/var/www/versions/1.1——把代码放在那里,安装你的资源、更新缓存等等。然后只需更改符号链接即可。
/var/www/mysite/web -> /var/www/versions/1.1/web

现在,如果网站崩溃了,你可以简单地将符号链接指回原处。这样的好处是您的网站没有停机时间,并且如果您犯了错误,很容易回滚。为了自动化此过程,我使用一个Bash脚本安装新版本并通过一系列命令更新符号链接,这些命令通过&&连接,因此如果安装的某个步骤失败,整个安装都会失败,您不会被困在版本混乱中。当然,可能有更好的方法来完成以上所有操作或进一步自动化它们,但关键是如果您正在更改生产环境,则需要执行Symfony安装/设置,而不让用户干扰。

嗯,我想知道这是否也可以使用Capifony完成。不过服务器会变得太臃肿了吧?你必须为每个版本复制所有的“web”图像和上传文件。 - George Irimiciuc
是的,那肯定会成为一个问题。我的网站往往几乎不使用图像,因此总体占用空间非常小,我也不保留过去的几十个版本或其他任何东西,只保留最近的2到3个版本。我相信Capifony会是一个不错的选择...部署不是我的强项,我尽量快速完成它,以便专注于开发。 - Jason Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接