我们正在尝试在运行Opcache时通过Capistrano部署新的PHP代码。
每次部署时,Capistrano都会创建一个新的部署目录,然后调整符号链接,以便Web服务器指向新目录。因为Opcache通过文件的真实路径进行缓存,这意味着新部署的站点版本与旧版本完全分开。
我们遇到的问题是Opcache会耗尽内存,因为每个新部署都会导致完整的代码库被缓存,旧的代码永远不会被驱逐。我们可以调用opcache_reset()
,但是当缓存重置时,我们会在缓存发生冲突时短暂地获得500个错误。 (如果我们尝试在不加热缓存的情况下启动新部署,我们也会遇到相同的错误。)
有没有更好的方法来解决这个问题?有些方法启动新代码而不填充opcache,直到内存不足(或因为文件太多而清空),这样我们就可以避免在实际站点上调用opcache_reset()
了?我们正在使用(或尝试转换到)Nginx作为我们的Web服务器,PHP-FPM处理PHP请求。
答案 0 :(得分:1)
选项是在部署结束时为旧版本站点中的每个文件调用opcache_invalidate
。您可以通过在失效后包含文件来阻止缓存标记。
第二个选项是将fpm设置为具有多个池,并逐个重新启动它们(它们将以干净的opcache开始)。您可能会在某种程度上阻止缓存标记只有一个服务器在任何给定时间都有一个干净的缓存,并且应用程序将保持运行,因为nginx将能够平衡各个池上的负载。
另一个选择是删除旧版本的脚本,以便opcache在revalidate_freq通过后从缓存中清除它们,强制它从文件系统加载新文件。