中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP7 opcache緩存清理問題

發布時間:2020-05-14 03:31:52 來源:網絡 閱讀:15649 作者:雙魚座小龍 欄目:web開發

PHP7 opcache緩存清理問題


背景

OPcache通過opcode的緩存和優化,提供更快的PHP執行過程。
業務在php7環境運營時,為了提升請求的性能,在PHP7環境中配置OPcache擴展。
業務在更新代碼后,訪問業務系統時提示無法找到對應的文件或請求的內容還是更新前的舊內容,
webserver重啟以后,請求訪問到的文件就都是最新的了,問題就貌似解決了。


問題分析

根據現象分析,代碼更新后請求找不到新增的文件,尤其是還在請求已有文件更新前的內容,那么可能跟緩存有關系,考慮到跟業務代碼邏輯無關,關閉opcache的配置問題就不再出現,基本上可以定位到問題出在opcache的配置上。

 

PHP7 opcache緩存清理問題

PHP7 opcache緩存清理問題

cat /usr/local/php/etc/subconfig/opcache.inizend_extension=opcache.soopcache.enable=1opcache.revalidate_freq=0opcache.validate_timestamps=0opcache.max_accelerated_files=7963opcache.memory_consumption=192opcache.interned_strings_buffer=16opcache.fast_shutdown=1opcache.enable_cli=1


opcache.enable 啟用操作碼緩存,默認為“1”

如果禁用此選項,則不會優化和緩存代碼。 在運行期使用 ini_set() 函數只能禁用 opcache.enable 設置,不可以啟用此設置。 如果在腳本中嘗試啟用此設置項會產生警告。

opcache.enable_cli  僅針對 CLI 版本的 PHP 啟用操作碼緩存。

 通常被用來測試和調試。

opcache.revalidate_freq=0  檢查腳本時間戳是否有更新的周期,以秒為單位。

設置為 0 會導致針對每個請求, OPcache 都會檢查腳本更新。


opcache.validate_timestamps=0  如果啟用,那么 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。

如果禁用此選項,你必須使用 opcache_reset() 或者 opcache_invalidate() 函數來手動重置 OPcache,也可以 通過重啟 Web 服務器來使文件系統更改生效。


最初的配置是:
opcache.revalidate_freq=60,opcache.validate_timestamps=1
即每60秒檢測一次更新字節碼緩存,業務代碼更新后可能需要60秒以后才能訪問到最新的內容,也就出現了最初訪問不到新增的內容。


代碼更新方式

php代碼的更新方式有兩種,一種是覆蓋webserver配置的目錄下的文件來更新,一種是每次都部署一個全量包目錄,然后軟鏈接到webserver指定的目錄。

第一種覆蓋更新的方式,如果使用在過期時間后自動清理opcache緩存內容的話,更新操作如果有延遲,就會出現新舊代碼文件混合在一起的情況。

第二種全量包目錄發布后,軟鏈接到webserver指定路徑的方式,雖然不會存在新舊文件混合的問題,但是在未自動清理時,即便webserver已經鏈接到webserver對應目錄,業務訪問的還是舊文件。


代碼緩存的問題

目前使用rsync同步目錄文件的方式是我們更新代碼的主要方式,最初使用每60s定時清理opcache的緩存文件,在60s內更新的文件不會生效,就導致了業務反饋代碼更新后訪問不到的問題。

使用定時更新代碼緩存的問題,還有更新文件較多時,代碼文件發布的過程中緩存發生更新,將會有60s新舊文件的緩存混合存在的問題。

根據相關研究人員推薦,如果采用覆蓋更新代碼文件時,更新操作完畢后,手動清理緩存比較合適。

opcache.validate_timestamps=0

 即,將oopcache.validate_timestamps設置為0。


配置了opcache.validate_timestamps值為0,必須手動清空Zend OPcache緩存的字節碼,才能訪問到最新的文件內容。適合在生產環境中設置為0,但在開發環境會帶來不便,可以在開發環境中這樣配置啟用自動驗證緩存功能:

opcache.validate_timestamps=1
opcache.revalidate_freq=0

手動清理緩存

除了重啟php-fpm的進程可以清理opcache緩存外,
手動清理緩存涉及到的opcache函數主要為:opcache_reset()和opcache_invalidate() 。

boolean opcache_reset ( void )
該函數將重置整個字節碼緩存。 
在調用 opcache_reset() 之后,所有的腳本將會重新載入并且在下次被點擊的時候重新解析。

需要注意的是,當PHP以PHP-FPM的方式運行的時候,opcache的緩存是無法通過php命令進行清除的,只能通過http或cgi到php-fpm進程的方式來清除緩存。

In some (most?) systems,
PHP's CLI has a separate opcode cache to the one used by the web server ,
or PHP-FPM process,which means running opcache_reset() in the CLI,
won't reset the webserver/fpm opcode cache, and vice-versa.

曲線救國,使用命令行清理php-fpm的opcache緩存:

#!/bin/bashcgi-fcgi -v  > /dev/null 2>&1|| yum --enablerepo=epel install fcgi -y  > /dev/null 2>&1echo '<?php opcache_reset(); echo "ok\n";' > /tmp/php-fpm-opcache-reset.php;
SCRIPT_FILENAME=/tmp/php-fpm-opcache-reset.php \
REQUEST_METHOD=GET \
cgi-fcgi -bind -connect 127.0.0.1:9000;
rm -f /tmp/php-fpm-opcache-reset.php;

 


opcache_invalidate  廢除指定腳本緩存

boolean opcache_invalidate ( string $script [, boolean $force = FALSE ] )
該函數的作用是使得指定腳本的字節碼緩存失效。 如果 force 沒有設置或者傳入的是 FALSE,那么只有當腳本的修改時間 比對應字節碼的時間更新,腳本的緩存才會失效。

參數 

script
緩存需要被作廢對應的腳本路徑

force
如果該參數設置為TRUE,那么不管是否必要,該腳本的緩存都將被廢除。


opcache_invalidate可以針對單個或幾個腳本進行來清理緩存。

總結


如果代碼發布是全量發布,切換軟鏈接的方式,可以設置opcache.validate_timestamps=1和opcache.validate_timestamps=1來定時自動更新緩存。

如果代碼發布是覆蓋更新舊目錄,則可以重啟php-fpm及在腳本中或代碼文件中使用opcache_reset函數來清理所有緩存。

如果可以獲取到更新的代碼文件列表,則可以使用opcache_invalidate函數來清理代碼,同時也可以避免影響到其他業務的緩存。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

垦利县| 铜川市| 玛多县| 商水县| 平果县| 商城县| 通化市| 宣威市| 无为县| 班戈县| 绥宁县| 普洱| 衡东县| 宁强县| 樟树市| 岢岚县| 沅江市| 华宁县| 苗栗县| 成安县| 天长市| 宜章县| 瑞昌市| 济南市| 修武县| 葫芦岛市| 建湖县| 佳木斯市| 蛟河市| 马边| 冷水江市| 厦门市| 潞城市| 镇雄县| 安仁县| 东城区| 江津市| 茌平县| 阿鲁科尔沁旗| 哈巴河县| 长垣县|