【问题标题】:Handling Symfony's cache in production在生产环境中处理 Symfony 的缓存
【发布时间】:2016-05-19 06:11:27
【问题描述】:

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

【问题讨论】:

  • 我更喜欢使用 'sudo rm -rf app/cache/*' 删除缓存,我认为您可以减少所需的时间
  • 当您手动清除缓存时,刷新也需要手动完成,否则请参考@johnSmith cmets 使其在更短的时间内自动刷新或完全禁用它。
  • 我不能像在带有 xampp 的 Windows 上那样使用 'rm'。
  • 另外,如果网站还在运行时仍然有人进入该网站会怎样?它不会也出错吗?我不相信它纯粹是即时的,尽管它比另一个更快。
  • 手动创建丢失的目录,问题解决了吗?

标签: php symfony caching


【解决方案1】:

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

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

【讨论】:

  • 我相信还有一个来自 lexik 的维护包。你也推荐那个吗?无论如何,访问此捆绑包生成的维护页面是否会尝试从缓存中写入或读取?因为那仍然不能解决问题。
  • 我没有使用 lexik 捆绑包的经验。 CorleyMaintenanceBundle 有两种模式,硬模式和软模式。您正在寻找适用于 apache/nginx 级别的硬锁。软锁仍会​​访问缓存。
【解决方案2】:

通常,如果您必须清除 Symfony 缓存,则意味着您正在更新到新版本 - 因此您不仅必须清除缓存,而且可能必须转储资产并执行其他任务。在这种情况下,我过去所做的非常有效的做法是将每个生产版本视为其自己的版本 n 其自己的文件夹 - 因此,当您安装新版本时,您会在未与网络服务器连接的情况下进行操作,然后只需更改完成后,您的网络服务器将指向新版本。额外的好处是,如果您搞砸了并且必须执行回滚,您只需立即链接回之前的版本。

例如,假设您的 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 图像并为每个版本上传。
  • 是的,这绝对是个问题。我的意思是我的网站几乎不使用任何图像,因此总体占用空间非常小,而且我不保留几十个过去的版本或任何东西,只保留最新的 2 或 3 个。我相信 Capifony 将是一个不错的选择。 ..部署不是我的事,我尽量尽快完成,这样我就可以专注于开发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2016-11-24
  • 2010-09-16
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多