OPcache影响线上发布问题

故事背景

公司服务器用的是Nginx,比如A项目的root目录是aa目录软链到a1
发布新版本代码后,会生成和a1同级的a2a1a2分别代表不通的发布版本,只需要将a目录的软链指到a2即可。
但是我们发现一个很奇怪的问题:
在访问A项目的时候,运行的还是a1的代码运行结果,理论上此时应该执行的是a2代码才对。
我们以为是Nginx服务器有缓存,就尝试修改a1里面的代码,和a2里面的代码,但是发现并没有用,程序依然运行的是a1的代码。
我们甚至把a1目录删了,报错内容都还是a1目录里的某部分代码。

解决方案

经过多方面的尝试,我们最终将问题定位到OPcache上,在关闭了Opcache后,我们发布了a3,运行结果显示的也是a3的程序结果,证明我们的推断是正确的。

总结

nginx应该是把目录a作为路径传递到了php-fpm中
OPcache也是以路径作为缓存代码的Key
所以说虽然软连接指向的目录改变了,但是OPcache识别到的目录是一样的,所以使用了直接缓存的文件。
建议大家在使用OPcache的时候,发布完新代码,记得调用函数opcache_reset()来清除缓存。该函数将重置整个字节码缓存。 在调用opcache_reset()之后,所有的脚本将会重新载入并且在下次被点击的时候重新解析。

发表回复