opcache的檢測文件更新的小坑

昨晚線上出故障,緊急處理切換容災後緩解了故障,解決故障後從容災切換回正式服務時發現PHP文件更新無效,重啓FPM後才生效。下面記錄覆盤追查的過程。php

由於是PHP文件更新不生效,因此立刻懷疑到opcache上面,到線上看了一眼php.ini,果真使用了opcache,而且檢測間隔時間設置爲60秒。查看昨晚的日誌,更新不生效持續時間遠遠大於60秒,因此這個檢測間隔時間的問題能夠PASS了,咱們繼續。服務器

在線上環境查看更新的文件和日誌中的時間的時候,忽然發現PHP文件時間和日誌中的時間對應不上,立刻找OP確認,OP交待說這個文件是回滾mv回來的,因此文件時間和我預期的不一致。我用stat命令看了一下,果真modify time相比access time早了一段時間,依據這點線索推測opcache依靠的是PHP文件的modify time做爲文件被修改的檢測條件。在線下復現問題,填坑成功!app

下面總結一下填坑過程當中查的一些相關的知識點函數

加載opcache

在php.ini中增長opcache時須要使用zend_extension,而不是extension,否則會獲得如下WARNING性能

PHP Warning:  PHP Startup: Invalid library (appears to be a Zend Extension, try loading using zend_extension=opcache.so from php.ini) in Unknown on line 0

配置opcache

使用下列推薦設置來得到較好的性能:日誌

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

本次涉及到的有兩個參數code

revalidate_freq,默認2
檢查腳本時間戳是否有更新的週期,以秒爲單位。 設置爲 0 會致使針對每一個請求, OPcache 都會檢查腳本更新string

validate_timestamps,默認1
若是啓用,那麼 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。 若是禁用此選項,你必須使用 opcache_reset() 或者 opcache_invalidate() 函數來手動重置 OPcache,也能夠 經過重啓 Web 服務器來使文件系統更改生效。it

系統命令和函數stat

access time 表示咱們最後一次訪問文件的時間
modify time 表示咱們最後一次修改文件的時間
change time 表示咱們最後一次對文件屬性改變的時間,包括權限,大小,屬性等等io

C/C++中也可使用stat方法查詢文件的這3個時間屬性,通常應用都會經過modify time判斷文件是否更新,咱們本次踩坑就是由於文件是mv操做的,modity time沒有更新,因此opcache沒有更新。

相關文章
相關標籤/搜索