我们试图在运行Opcache时通过Capistrano部署新的PHP代码。运行Opcache时部署新的PHP代码
Capistrano的创建一个新的部署目录每次部署时,再调一个符号链接,这样Web服务器指向新的目录。由于Opcache通过文件的真实路径进行缓存,这意味着新部署的站点版本会与旧版本完全分开缓存。
我们正在运行到的问题是Opcache耗尽内存,因为每一个新的部署会导致缓存完整的代码库,而老的代码永远不会被驱逐。我们可以调用opcache_reset()
,但是当缓存被重置时,当缓存发生踩踏时,我们会短暂地获得500个错误。 (我们也有同样的错误,如果我们试图推出一个新的部署,而不热身缓存)
有没有更好的方式来处理呢?有些方法可以启动新代码,但在内存耗尽之前不填充opcache(或者因为文件太多而清空本身),这样可以避免在活动网站上调用opcache_reset()
?我们正在使用(或试图转换到Nginx)作为我们的Web服务器,并使用PHP-FPM处理PHP请求。
正如我在T0xicCode的回答中所解释的,旧版本的op_arrays是死区,直到被重置回收。诀窍是让缓存大到足以容纳应用程序的两个副本,然后在日常加载周期的坟墓转换部分进行重置。 – TerryE