服務器代碼文件緩存疑難

故事背景

公司服務器用的是Nginx,好比A項目的root目錄是aa目錄軟鏈到a1
發佈新版本代碼後,會生成和a1同級的a2a1a2分別表明不通的發佈版本,只須要將a目錄的軟鏈指到a2便可。
可是咱們發現一個很奇怪的問題:
在訪問A項目的時候,運行的仍是a1的代碼運行結果,理論上此時應該執行的是a2代碼纔對。
咱們覺得是Nginx服務器有緩存,就嘗試修改a1裏面的代碼,和a2裏面的代碼,可是發現並無用,程序依然運行的是a1的代碼。
咱們甚至把a1目錄刪了,報錯內容都仍是a1目錄裏的某部分代碼。php

解決方案

通過多方面的嘗試,咱們最終將問題定位到OPcache上,在關閉了Opcache後,咱們發佈了a3,運行結果顯示的也是a3的程序結果,證實咱們的推斷是正確的。nginx

總結

nginx應該是把目錄a做爲路徑傳遞到了php-fpm中
OPcache也是以路徑做爲緩存代碼的Key
因此說雖然軟鏈接指向的目錄改變了,可是OPcache識別到的目錄是同樣的,因此使用了直接緩存的文件。
建議你們在使用OPcache的時候,發佈完新代碼,記得調用函數opcache_reset()來清除緩存。該函數將重置整個字節碼緩存。 在調用opcache_reset()以後,全部的腳本將會從新載入而且在下次被點擊的時候從新解析。緩存

相關文章
相關標籤/搜索