capistrano - 运行 Opcache 时部署新的 PHP 代码

标签 capistrano php opcache

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

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

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

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

最佳答案

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

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

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

关于capistrano - 运行 Opcache 时部署新的 PHP 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27914607/

相关文章:

ruby-on-rails - rails4 - Psych::BadAlias:未知别名:test

php - 理解php中的三元运算符

php - 在 cookie 中存储数组

php - opcache默认缓存目录在哪里?

php - Opcache - 在 PHP5.4 及更低版本中清除缓存

php - OPCache 已启用,但 php -i 显示它已禁用

ruby - 如何使用 Capistrano 3 作为另一个用户进行部署

ruby-on-rails - 卸载 capistrano 并在 ruby​​-1.8.7 中安装特定版本

java - Capistrano for Java (EE) Web 应用程序

php - 警告 1264 超出为列(日期时间列)调整的值范围