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


Handling Symfony's cache in production

我有一个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文件夹时,会出现此错误。如果我删除文件夹的内容而不删除文件夹本身,则似乎不会发生错误。我想知道为什么。

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

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

通常,如果你必须清除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安装/设置,而不会让用户干扰。