摘要:我們以為是服務器有緩存,就嘗試修改里面的代碼,和里面的代碼,但是發現并沒有用,程序依然運行的是的代碼。建議大家在使用的時候,發布完新代碼,記得調用函數來清除緩存。該函數將重置整個字節碼緩存。
故事背景
公司服務器用的是Nginx,比如A項目的root目錄是a,a目錄軟鏈到a1。
發布新版本代碼后,會生成和a1同級的a2,a1和a2分別代表不通的發布版本,只需要將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()之后,所有的腳本將會重新載入并且在下次被點擊的時候重新解析。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30403.html
摘要:使用開發已經很久了,但是最近看過一些代碼,卻發現自己竟然不知道為什么運行結果會是那個樣子,特收集記錄之,代碼運行結果大家請自行嘗試,我會不斷更新此文,弄明白為什么會是那個結果后,會更新原因,也希望看到的朋友能分享出來。 使用PHP開發已經很久了,但是最近看過一些代碼,卻發現自己竟然不知道為什么運行結果會是那個樣子,特收集記錄之,代碼運行結果大家請自行嘗試,我會不斷更新此文,弄明白為什么...
閱讀 904·2021-09-29 09:35
閱讀 1253·2021-09-28 09:36
閱讀 1522·2021-09-24 10:38
閱讀 1066·2021-09-10 11:18
閱讀 631·2019-08-30 15:54
閱讀 2496·2019-08-30 13:22
閱讀 1964·2019-08-30 11:14
閱讀 697·2019-08-29 12:35