我们试图在运行Opcache的同时通过Capistrano部署新的PHP代码。
Capistrano会在您每次部署时创建一个新的部署目录,然后调整符号链接,以便new服务器指向新目录。因为Opcache按文件的实际路径进行缓存,这意味着新部署的站点版本与旧版本完全分开缓存。
我们遇到的问题是Opcache耗尽了内存,因为每次新部署都会导致整个代码库被缓存,而旧代码永远不会被逐出。我们可以调用opcache_reset(),但是当缓存被重置时,当缓存蜂拥而出时,我们会短暂地得到500个错误。(如果我们试图在不预热缓存的情况下启动新的部署,我们也会遇到相同的错误。)
有没有更好的方法来处理这件事?有没有办法在启动新代码的同时不填满opcache,直到它耗尽内存(或者因为它有太多的文件而清空了自己),这样我们就可以避免在实时站点上调用opcache_reset()?我们正在使用(或尝试转换到) Nginx作为我们的web服务器,由PHP-FPM处理PHP请求。
发布于 2015-01-13 12:23:22
一种选择是在部署结束时为站点的旧版本中的每个文件调用opcache_invalidate。您可以通过在失效后包含文件来防止缓存崩溃。
第二种选择是将fpm设置为具有多个池,并逐个重新启动它们(它们将从一个干净的opcache开始)。您将在一定程度上防止缓存崩溃在任何给定时间只有一台服务器具有干净的缓存,并且应用程序将保持运行,因为nginx将能够平衡不同池上的负载。
另一种选择是删除脚本的旧版本,这样一旦revalidate_freq通过,opcache就会从缓存中清除它们,强制它从文件系统加载新文件。
https://stackoverflow.com/questions/27914607
复制相似问题