欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決PHP Opcache 緩存刷新、代碼重載出現(xiàn)無法更新代碼的問題

 更新時間:2020年08月24日 10:05:48   作者:17ms  
這篇文章主要介紹了解決PHP Opcache 緩存刷新、代碼重載出現(xiàn)的無法更新代碼的問題,幫助大家更好的理解和學習php,感興趣的朋友可以了解下

問題背景

通過啟用Opcache的緩存優(yōu)化,將PHP代碼預編譯為Opcode緩存到共享內(nèi)存中供進程反復調(diào)用,從而減少了重復從磁盤解析PHP代碼的時間消耗,顯著的提高了PHP性能,提升了業(yè)務性能的調(diào)用,但是也引發(fā)了一些問題,就是我們每次更新了相應的PHP代碼后,web server 無法即時加載到更新后的代碼。

解決方案

(一)、設置Opcache腳本驗證時間

可以通過更改 Opcache 以下兩個配置選項來調(diào)整代碼重載時間

opcache.revalidate_freq=0 檢查腳本時間戳是否有更新的周期,以秒為單位。(如果設置為 0 會導致針對每個請求, OPcache 都會檢查腳本更新)

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

PS:在實際生產(chǎn)環(huán)境中,為了盡可能達到最優(yōu)性能,盡量不開啟文件更新驗證,因為每次驗證都會重新預編譯PHP代碼到共享內(nèi)存中。

(二)、重啟 | 重載 php-fpm 進程

每次重啟或重啟 php-fpm 進程便會重新解析PHP腳本文件,但是重啟 fpm 進程可能會導致請求中斷,從而導致寫入臟數(shù)據(jù) 或者 造成事務回滾等一系列異常。

重載相對于重啟則平順很多,不會導致用戶請求直接中斷,相對來說風險低很多,但是php-fpm 收到reload信號,便會向所有子進程發(fā)送SIGGUIT信號,同時注冊一個定時器,在規(guī)定的時間之內(nèi)子進程沒有退出,接著在發(fā)送SIGTERM信號,結束子進程。如果在一秒之內(nèi)子進程還是沒結束 直接發(fā)送SIGKILL 強制殺死。

重啟php-fpm

service php-fpm restart

重載php-fpm

services php-fpm reload

或 kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

(三)、手動清理緩存

除了上面的兩種方式,還有更為穩(wěn)妥一點的緩存清理,我們可以通過opcache_reset()和opcache_invalidate() 函數(shù)來刷新Opcache緩存。

opcache_reset() - 重置整個Opcode緩存,所有的PHP腳本將會被重新解析再預編譯為Opcode。

opcache_invalidate() - 清除指定腳本緩存,可以傳遞兩個參數(shù),一個是刷新文件路徑,一個是force字段, 如果 force 沒有設置或者傳入的是 FALSE,那么只有當腳本的修改時間 比對應Opcode的時間更新時,腳本的緩存才會失效。

需要注意的是,當PHP以PHP-FPM的方式運行的時候,opcache的緩存是無法通過php命令進行清除的,只能通過http或cgi到php-fpm進程的方式來清除緩存,我們可以編寫一個對外接口,來達到清理緩存的目的。

相關實現(xiàn)如下(框架:laravel):

Route::any('cache-reset', function () {
  //重置整個Opcode緩存
  dd(opcache_reset());
});

Route::any('cache-update', function () {
  //清除掉最近一次更新文件的緩存
  exec('git diff --name-only HEAD~ HEAD', $output);
  foreach ($output as $file) {
    $path = base_path($file);
    opcache_invalidate($path, true);
  }
  dd('刷新完成');
});

總結

通過上面的三種策略,可以實現(xiàn) Opcache 緩存更新的目的,但是在流量高峰期或者大流量的服務端,每次更新緩存都是一件非常損耗資源的事情,Opcache在重建緩存時,也不會禁止其他進程讀取,因此就會造成反復新建緩存,因此想要達到最佳的性能調(diào)配:

  • 最好不要在高峰期清理緩存
  • 高峰期不要頻繁的更新代碼,清理緩存,會造成重復新建緩存
  • 如果需要更新,可以嘗試削弱服務端權重,實現(xiàn)逐個更新的目的。
  • 如果需要強制更新,盡量選擇手動清除緩存的方式,來重建Opcache緩存,使代價最小化。

以上就是解決PHP Opcache 緩存刷新、代碼重載出現(xiàn)無法更新代碼的問題的詳細內(nèi)容,更多關于PHP Opcache 緩存刷新、代碼重載的資料請關注腳本之家其它相關文章!

相關文章

  • php設計模式 Observer(觀察者模式)

    php設計模式 Observer(觀察者模式)

    定義對象間的一種一對多的依賴關系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新 能夠便利地創(chuàng)建查看目標對象狀態(tài)的對象,并且提供與核心對象非耦合的指定功能
    2011-06-06
  • PHP中實現(xiàn)漢字轉區(qū)位碼應用源碼實例解析

    PHP中實現(xiàn)漢字轉區(qū)位碼應用源碼實例解析

    PHP里如何實現(xiàn)漢字轉區(qū)位碼這個問題一直困擾這大多程序員,那么下面這個源碼實例相信能給大家?guī)砗艽蟮膸椭?/div> 2010-06-06
  • php實現(xiàn)httpRequest的方法

    php實現(xiàn)httpRequest的方法

    這篇文章主要介紹了php實現(xiàn)httpRequest的方法,涉及php操作http的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • php heredoc和phpwind的模板技術使用方法小結

    php heredoc和phpwind的模板技術使用方法小結

    Heredoc技術,在正規(guī)的PHP文檔中和技術書籍中一般沒有詳細講述,只是提到了這是一種Perl風格的字符串輸出技術。但是現(xiàn)在的一些論壇程序,和部分文章系統(tǒng),都巧妙的使用heredoc技術,來部分的實現(xiàn)了界面與代碼的準分離,phpwind就是一個典型的例子。
    2008-03-03
  • 兩千行代碼的PHP學習筆記匯總

    兩千行代碼的PHP學習筆記匯總

    這篇文章主要介紹了兩千行代碼的PHP學習筆記匯總,由黑眼詩人整理匯總,包括了PHP學習中各類常見的技巧,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • PHP封裝的svn類使用內(nèi)置svn函數(shù)實現(xiàn)根據(jù)svn版本號導出相關文件示例

    PHP封裝的svn類使用內(nèi)置svn函數(shù)實現(xiàn)根據(jù)svn版本號導出相關文件示例

    這篇文章主要介紹了PHP封裝的svn類使用內(nèi)置svn函數(shù)實現(xiàn)根據(jù)svn版本號導出相關文件,結合實例形式分析了php封裝的svn操作類與根據(jù)版本導出相關版本文件操作技巧,需要的朋友可以參考下
    2018-06-06
  • PHP四大安全策略

    PHP四大安全策略

    這篇文章主要介紹了PHP中的文件系統(tǒng)安全、數(shù)據(jù)庫安全、用戶數(shù)據(jù)安全等安全相關的問題,需要的朋友可以參考下
    2014-03-03
  • php實現(xiàn)刪除指定目錄下相關文件的方法

    php實現(xiàn)刪除指定目錄下相關文件的方法

    這篇文章主要介紹了php實現(xiàn)刪除指定目錄下相關文件的方法,主要涉及對文件的遍歷以及對文件的各種常用操作,需要的朋友可以參考下
    2014-10-10
  • php實現(xiàn)的Curl封裝類Curl.class.php用法實例分析

    php實現(xiàn)的Curl封裝類Curl.class.php用法實例分析

    這篇文章主要介紹了php實現(xiàn)的Curl封裝類Curl.class.php用法,以完整實例形式較為詳細的分析了Curl封裝類的定義及相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • PHP中HTTP方式下的Gzip壓縮傳輸方法舉偶

    PHP中HTTP方式下的Gzip壓縮傳輸方法舉偶

    PHP中HTTP方式下的Gzip壓縮傳輸方法舉偶...
    2007-02-02

最新評論