资讯专栏INFORMATION COLUMN

服务器代码文件缓存疑难

Ilikewhite / 1933人阅读

摘要:我们以为是服务器有缓存,就尝试修改里面的代码,和里面的代码,但是发现并没有用,程序依然运行的是的代码。建议大家在使用的时候,发布完新代码,记得调用函数来清除缓存。该函数将重置整个字节码缓存。

故事背景

公司服务器用的是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()之后,所有的脚本将会重新载入并且在下次被点击的时候重新解析。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30403.html

相关文章

  • php疑难杂症代码收集(不断增长中)

    摘要:使用开发已经很久了,但是最近看过一些代码,却发现自己竟然不知道为什么运行结果会是那个样子,特收集记录之,代码运行结果大家请自行尝试,我会不断更新此文,弄明白为什么会是那个结果后,会更新原因,也希望看到的朋友能分享出来。 使用PHP开发已经很久了,但是最近看过一些代码,却发现自己竟然不知道为什么运行结果会是那个样子,特收集记录之,代码运行结果大家请自行尝试,我会不断更新此文,弄明白为什么...

    enda 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<