3

我们正在尝试在运行 Opcache 时通过 Capistrano 部署新的 PHP 代码。

Capistrano 每次部署时都会创建一个新的部署目录,然后调整符号链接,以便网络服务器指向新目录。因为 Opcache 通过文件的真实路径进行缓存,这意味着新部署的站点版本与旧版本完全分开缓存。

我们遇到的问题是 Opcache 耗尽了内存,因为每次新部署都会导致整个代码库被缓存,而旧代码永远不会被驱逐。我们可以调用opcache_reset(),但是当缓存被重置时,当缓存踩踏时我们会短暂地得到 500 错误。(如果我们尝试在不预热缓存的情况下启动新部署,也会出现同样的错误。)

有没有更好的方法来处理这个?有什么方法可以启动新代码而不填满 opcache,直到它耗尽内存(或者因为它有太多文件而清空自己),这样我们就可以避免调用opcache_reset()实时站点?我们正在使用(或尝试过渡到)Nginx 作为我们的 Web 服务器,使用 PHP-FPM 处理 PHP 请求。

4

1 回答 1

1

一个选项是在部署结束时调用opcache_invalidate旧版本站点中的每个文件。您可以通过在失效后包含文件来防止缓存踩踏。

第二种选择是将 fpm 设置为具有多个池,并一个一个地重新启动它们(它们将从一个干净的 opcache 开始)。您将在一定程度上防止缓存踩踏,在任何给定时间只有一台服务器拥有干净的缓存,并且应用程序将保持运行,因为 nginx 将能够平衡各个池上的负载。

另一种选择是删除脚本的旧版本,以便 opcache 在 revalidate_freq 过去后从缓存中清除它们,强制它从文件系统加载新文件。

于 2015-01-13T04:23:21.953 回答