2015-01-13 22 views
0

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

Capistrano的创建一个新的部署目录每次部署时,再调一个符号链接,这样Web服务器指向新的目录。由于Opcache通过文件的真实路径进行缓存,这意味着新部署的站点版本会与旧版本完全分开缓存。

我们正在运行到的问题是Opcache耗尽内存,因为每一个新的部署会导致缓存完整的代码库,而老的代码永远不会被驱逐。我们可以调用opcache_reset(),但是当缓存被重置时,当缓存发生踩踏时,我们会短暂地获得500个错误。 (我们也有同样的错误,如果我们试图推出一个新的部署,而不热身缓存)

有没有更好的方式来处理呢?有些方法可以启动新代码,但在内存耗尽之前不填充opcache(或者因为文件太多而清空本身),这样可以避免在活动网站上调用opcache_reset()?我们正在使用(或试图转换到Nginx)作为我们的Web服务器,并使用PHP-FPM处理PHP请求。

+0

正如我在T0xicCode的回答中所解释的,旧版本的op_arrays是死区,直到被重置回收。诀窍是让缓存大到足以容纳应用程序的两个副本,然后在日常加载周期的坟墓转换部分进行重置。 – TerryE

回答

1

的办法是打电话opcache_invalidate每个在旧版本的网站的文件在部署结束。您可以通过在失效之后包含文件来防止缓存踩踏事件。

第二个选项是设置FPM有多个池,并把它们重新一一(他们会用干净的opcache开始)。您可以在某种程度上防止缓存踩踏,只有一台服务器在任何时候都有干净的缓存,并且应用程序将保持运行状态,因为nginx将能够平衡各种池上的负载。

另一种方法是删除旧版本的脚本,以便一旦revalidate_freq通过,opcache会从缓存中清除它们,迫使它从文件系统加载新文件。

+0

由于OPcache不采用资源重用模型,因此使用invalidate对此用例没有帮助。直到执行重置或由ini设置触发该空间为止。 – TerryE