在生产中处理Symfony的缓存

时间:2016-02-09 10:01:14

标签: php symfony caching

我有一个Symfony2网站,我正在测试生产。我继续清理它的缓存,因为我已经制作并可能会进行更多修改,但是有一个小问题:

正在清除缓存并说,之后我想热身,访问网站的人重建缓存。这会在构建缓存时产生一个小问题,但不会完全,而其中一半会被删除,因为删除仍在进行中。

之后发生的是,缓存是构建的,但只是其中的一部分。 Symfony认为缓存是完全构建的,并且运行时不再尝试构建它,但它运行在半构建的缓存上。删除过程有点长(约15秒),因此在这段时间内,没有人必须通过访问网站来尝试创建缓存。

或者,或者缓存是完全构建的,它会覆盖旧缓存,系统会将这些新文件视为旧文件,删除部分文件,保留其他文件。不完全确定,我不确定如何检查。

例如,我得到的一个错误是

The directory "D:\xampp\htdocs\med-app\app\app\cache\dev/jms_diextra/metadata" does not exist.

如果我不使用该捆绑包,我会从Doctrine中获得另一个缓存问题。这将出现在每个网站访问,直到我再次删除缓存没有任何人访问该网站。它完全阻止访问网站并使其无法正常运行。

另外,热身怎么样?这也需要一段时间。如果有人在缓存预热时访问网站怎么办?也不会造成冲突吗?

如何处理这个问题?我是否需要关闭apache服务,清除和加热缓存然后重启apache?如何处理生产中的网站?

修改 我发现了一些有趣的东西。删除cache/prod文件夹时发生错误。如果我删除文件夹的内容而不删除文件夹本身,似乎不会发生错误。我想知道为什么。

2 个答案:

答案 0 :(得分:4)

通常,如果您正在执行更新,或者因生产中的任何其他原因清除缓存,则最好将网站锁定为维护模式。有时,Web托管服务有此选项可以为您处理此问题,或者有一个nice bundle可以从命令行轻松处理维护。

这样您就可以安全地删除缓存,并确保没有人访问该页面并错误地重建缓存。

答案 1 :(得分:3)

通常,如果必须清除Symfony缓存,则意味着您要更新到新版本 - 因此不仅需要清除缓存,而且您可能不得不转储资产并执行其他任务。在这种情况下,我过去做得非常好的是将每个生产版本作为自己的版本在自己的文件夹中处理 - 所以当你安装新版本时,你可以从网络服务器上取下它,然后只需更改完成后,您的网络服务器将指向新版本。额外的好处是,如果你搞砸了一些东西并且必须执行回滚,你只需立即链接回以前的版本。

例如,假设您的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安装/设置而不让用户干扰它。