公司服務器用的是Nginx,好比A
項目的root目錄是a
,a
目錄軟鏈到a1
。
發佈新版本代碼後,會生成和a1
同級的a2
,a1
和a2
分別表明不通的發佈版本,只須要將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()
以後,全部的腳本將會從新載入而且在下次被點擊的時候從新解析。緩存