您好,登錄后才能下訂單哦!
這篇文章主要講解了“PHP的優化加速組件Opcache怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PHP的優化加速組件Opcache怎么使用”吧!
Opcache是一種通過將解析的PHP腳本預編譯的字節碼(Operate Code)存放在共享內存中來避免每次加載和解析PHP腳本的開銷,解析器可以直接從共享內存讀取已經緩存的字節碼(Operate Code),從而大大提高PHP的執行效率。
這得從PHP代碼的生命周期說起,請求PHP腳本時,會經過五個步驟,如下圖所示:
Zend引擎必須從文件系統讀取文件、掃描其詞典和表達式、解析文件、創建要執行的計算機代碼(稱為Opcode),最后執行Opcode。每一次請求PHP腳本都會執行一遍以上步驟,如果PHP源代碼沒有變化,那么Opcode也不會變化,顯然沒有必要每次都重行生成Opcode,結合在Web中無所不在的緩存機制,我們可以把Opcode緩存下來,以后直接訪問緩存的Opcode豈不是更快,啟用Opcode緩存之后的流程圖如下所示:
Opcode是一種PHP腳本編譯后的中間語言,就像Java的ByteCode,或者.NET的MSL,舉個例子,比如你寫下了如下的PHP代碼:
echo "Hello World"; $a = 1 + 1; echo $a; ?>
PHP執行這段代碼會經過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend)
1)Scanning(Lexing) ,將PHP代碼轉換為語言片段(Tokens)。 2)Parsing, 將Tokens轉換成簡單而有意義的表達式。 3)Compilation, 將表達式編譯成Opocdes。 4)Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。
Optimizer+(Optimizer+于2013年3月中旬改名為Opcache),OPcache通過將PHP腳本預編譯的字節碼存儲到共享內存中來提升PHP的性能,存儲預編譯字節碼的好處就是省去了每次加載和解析PHP腳本的開銷。
PHP 5.5.0 及后續版本中已經綁定了 OPcache 擴展。 對于 PHP 5.2,5.3 和 5.4 版本可以使用 » PECL擴展中的OPcache庫。
PHP 5.5.0及后續版本
OPcache只能編譯為共享擴展。如果你使用–disable-all參數禁用了默認擴展的構建,那么必須使用–enable-opcache選項來開啟OPcache。編譯之后,就可以使用 zend_extension 指令來將 OPcache 擴展加載到 PHP 中。
推薦的php.ini設置
使用下列推薦設置來獲得較好的性能:
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 opcache.save_comments=0
你也可以禁用 opcache.save_comments 并且啟用 opcache.enable_file_override。 需要提醒的是,在生產環境中使用上述配置之前,必須經過嚴格測試。 因為上述配置存在一個已知問題,它會引發一些框架和應用的異常, 尤其是在存在文檔使用了備注注解的時候。
以下是opcache的配置說明,其中給有值得都是默認配置:
; opcache的開關,關閉時代碼不再優化. opcache.enable=1 ; Determines if Zend OPCache is enabled for the CLI version of PHP opcache.enable_cli=1 ; OPcache的共享內存大小,以兆字節為單位。總共能夠存儲多少預編譯的PHP代碼(單位:MB) ; 推薦128 opcache.memory_consumption=64 ; 用來存儲臨時字符串的內存大小,以兆字節為單位. ; 推薦8 opcache.interned_strings_buffer=4 ; 最大緩存的文件數目200到100000之間. ; 推薦4000 opcache.max_accelerated_files=2000 ; 內存"浪費"達到此值對應的百分比,就會發起一個重啟調度. opcache.max_wasted_percentage=5 ; 開啟這條指令, Zend Optimizer + 會自動將當前工作目錄的名字追加到腳本鍵上,以此消除同名文件間的鍵值命名沖突.關閉這條指令會提升性能,但是會對已存在的應用造成破壞. opcache.use_cwd=0 ; 開啟文件時間戳驗證 opcache.validate_timestamps=1 ; 檢查腳本時間戳是否有更新的周期,以秒為單位。設置為0會導致針對每個請求,OPcache都會檢查腳本更新. ; 推薦60 opcache.revalidate_freq=2 ; 允許或禁止在include_path中進行文件搜索的優化. opcache.revalidate_path=0 ; 如果禁用,腳本文件中的注釋內容將不會被包含到操作碼緩存文件,這樣可以有效減小優化后的文件體積,禁用此配置指令可能會導致一些依賴注釋或注解的應用或框架無法正常工作,比如:Doctrine,Zend Framework2等. ; 推薦0 opcache.save_comments=1 ; 如果禁用,則即使文件中包含注釋,也不會加載這些注釋內容。本選項可以和opcache.save_comments一起使用,以實現按需加載注釋內容. opcache.load_comments=1 ; 打開快速關閉,打開這個在PHP Request Shutdown的時候會收內存的速度會提高. ; 推薦1 opcache.fast_shutdown=1 ; 允許覆蓋文件存在(file_exists等)的優化特性. opcache.enable_file_override=0 ; 定義啟動多少個優化過程. opcache.optimization_level=0xffffffff ; 啟用此Hack可以暫時性的解決"can’t redeclare class"錯誤. opcache.inherited_hack=1 ; 啟用此Hack可以暫時性的解決"can’t redeclare class"錯誤. ;opcache.dups_fix=0 ; 通過文件大小屏除大文件的緩存,默認情況下所有的文件都會被緩存. ;opcache.max_file_size=0 ; 每N次請求檢查一次緩存校驗.默認值0表示檢查被禁用了,由于計算校驗值有損性能,這個指令應當緊緊在開發調試的時候開啟. ;opcache.consistency_checks=0 ; 從緩存不被訪問后,等待多久后(單位為秒)調度重啟. ;opcache.force_restart_timeout=180 ; 日志記錄level,默認只有fatal error和error. ;opcache.error_log= ; 將錯誤信息寫入到服務器(Apache等)日志 ;opcache.log_verbosity_level=1 ; 內存共享的首選后臺.留空則是讓系統選擇. ;opcache.preferred_memory_model= ; 運行php腳本時保護共享內存防止意外的寫入,只對debug時有用. ;opcache.protect_memory=0
最后說一下使用opcache加速php時應該注意的坑:
opcache依靠的是PHP文件的modify time作為文件被修改的檢測條件,基于這個會引發兩個問題。
第一個問題是做版本回滾時,由于版本回滾后的文件修改時間比現有opcache緩存的文件時間要往前一些,所以可能會導致opcache不會清除緩存,需要手動reload。
第二個問題是做版本發布時,一般都是sync方式,可能會出現文件發布一半時被opcache緩存,用戶訪問會報程序錯誤,這個主要是因為文件內容緩存了一半,但是文件的時間戳不會在改變,所以就算opcache檢測時也不會去讀取新的文件了,需要手動reload。
針對這兩個問題,不光reload可以解決,同樣調用opcache的接口也可以清除opcache緩存。
你可以使用opcache_reset()或者或者opcache_invalidate()函數來手動重置OPcache。
opcache_reset():該函數將重置整個字節碼緩存,在調用opcache_reset()之后,所有的腳本將會重新載入并且在下次被點擊的時候重新解析。
opcache_invalidate():該函數的作用是使得指定腳本的字節碼緩存失效。 如果force沒有設置或者傳入的是FALSE,那么只有當腳本的修改時間 比對應字節碼的時間更新,腳本的緩存才會失效。
但是不推薦使用,個人在生產環境中進行代碼發布后調用opcache_reset()清空緩存(測試確實可以清空緩存),出現過奇葩問題(訪問量大的應用),后來就果斷放棄了,使用了reload的方式。
感謝各位的閱讀,以上就是“PHP的優化加速組件Opcache怎么使用”的內容了,經過本文的學習后,相信大家對PHP的優化加速組件Opcache怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。