在运行Opcache时部署新的PHP代码

3
我们正尝试通过Capistrano部署新的PHP代码,并同时运行Opcache。
每次部署时,Capistrano都会创建一个新的部署目录,然后调整符号链接以便Web服务器指向新目录。由于Opcache按文件的实际路径进行缓存,这意味着新部署的站点版本与旧版本完全分开缓存。
我们遇到的问题是,由于每个新部署都会导致完整的代码库被缓存,因此旧代码永远不会被驱逐,因此Opcache的内存用完了。我们可以调用opcache_reset(),但是当缓存被重置时,我们会出现短暂的500错误。如果我们尝试在没有预热缓存的情况下启动新的部署,我们也会遇到相同的错误。
有没有更好的方式来处理这个问题?有没有一种方法可以在不将Opcache填满并使其耗尽内存(或清空自身,因为它有太多文件)的情况下启动新代码,从而避免在生产站点上调用opcache_reset()?我们正在使用(或尝试过渡到)Nginx作为我们的Web服务器,PHP-FPM处理PHP请求。

1
正如我在T0xicCode的回答中所解释的那样,旧版本的op_arrays在重置之前都是无用的空间。关键是要确保缓存足够大,可以容纳两份应用程序副本,并在每日负载周期的“夜班”期间进行重置。 - TerryE
1个回答

1
一个选项是,在部署结束时为旧版本站点中的每个文件调用opcache_invalidate。您可以通过在失效后包含文件来预防缓存踩踏。
第二个选项是设置fpm具有多个池,并逐个重启它们(它们将以干净的opcache开始)。您将在任何给定时间仅有一个服务器具有清洁缓存,因此您将在一定程度上防止缓存踩踏,应用程序将保持运行,因为nginx将能够在各种池之间平衡负载。
另一个选项是删除脚本的旧版本,这样一旦revalidate_freq过去,opcache就会从缓存中清除它们,强制从文件系统加载新文件。

2
在这种情况下,使用invalidate无法帮助,因为OPcache不采用资源重用模型。该空间直到执行重置或由ini设置触发之前都是无效的。 - TerryE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接