大家知道目前PHP的快取外掛一般有三個:APC、eAccelerator、XCache,但未來它們可能都會消失,因為PHP 5.5已經整合Zend Opcache,功能和前三者相似但又有少許不同,快取速度據說比它們更快(注意:只是據說,我沒測試過)。

這幾個PHP加速外掛的主要原理都相同,就是把PHP執行後的資料緩衝到記憶體中從而避免重複的編譯過程,能夠直接使用緩衝區已編譯的程式碼從而提高速度,降低伺服器負載,它們的效率是顯而易見的。

Zend Opcache在PHP 5.5後的版本中已經整合了,編譯安裝PHP5.5的時候加上–enable-opcache就行了,也支援低版本的 PHP 5.2.*, 5.3.*, 5.4.*,未來會取消對5.2的支援。

 

如果在編譯安裝php5.5.34的時候,沒有新增–enable-opcache引數,那麼在php.ini中新增一些配置引數,啟用即可,php5以後的版本中已經內建Zend Opcache,所以無需另外安裝



cd /usr/local/php/lib

cp php.ini php.ini.bak #備份配置檔案

vim php.ini,shfit+g到最後,新增如下配置

—————————————————————————————————–

[opcache]

zend_extension=opcache.so

opcache.interned_strings_buffer=8

opcache.fast_shutdown=1

opcache.enable_cli=1

opcache.enable=1

 

;可用記憶體,酌情而定,單位 megabytes

opcache.memory_consumption=128

 

;最大快取的檔案數目,命中率不到100%的話,可以試著提高這個值

opcache.max_accelerated_files=4000 

 

;Opcache 會在一定時間內去檢查檔案的修改時間,這裡設定檢查的時間週期,預設為 2,單位為秒

opcache.revalidate_freq=60

——————————————————————————————————

如果是nginx環境,重啟一下php-fpm程式即可

檢視一下Zend Opcache是否啟用

/usr/local/php/bin/php -v

最後一行帶有 with Zend OPcache等字樣 即表示啟用

 

Opcache的配置引數詳細解釋如下:

名字 預設 可修改範圍 含義
opcache.enable “1” PHP_INI_ALL 是否啟用opcache
opcache.enable_cli “0” PHP_INI_SYSTEM 是否在CLI(即命令列時)啟用opcache
opcache.memory_consumption “64” PHP_INI_SYSTEM 為opcache分配多少共享記憶體,單位M
opcache.interned_strings_buffer “4” PHP_INI_SYSTEM interned string的記憶體大小
opcache.max_accelerated_files “2000” PHP_INI_SYSTEM

最大快取的檔案數目。

實際上這個值會使用第一個大於你配置的數字的下列素數

{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 },

如你將該值指定為400,則實際上該值為463.

opcache.max_wasted_percentage “5” PHP_INI_SYSTEM
opcache.use_cwd “1” PHP_INI_SYSTEM

如果置為1,則將當前路徑加入到檔案key中,

以避免可能產生的同檔名的檔案key衝突

opcache.validate_timestamps “1” PHP_INI_ALL

如果置為1,則OPCACHE會自動檢測檔案的時間戳

(檢測週期為revalidate_freq),

並根據檔案的時間戳來更新opcode,如果置為0,

則只能手動去重啟opcache或

重啟webserver以使更新後的php檔案生效

opcache.revalidate_freq “2” PHP_INI_ALL

opcache自動檢測檔案是否更新的週期,單位秒。

如果是0,則每次請求時opcache都要進行檢測。

當validate_timestamps為0時,本指令無效。

opcache.revalidate_path “0” PHP_INI_ALL
opcache.save_comments “1” PHP_INI_SYSTEM 是否儲存檔案中的註釋
opcache.load_comments “1” PHP_INI_ALL

是否load comments,與save_comments聯合起來使用,

如果該值為0,則即使save_comments為1,

那麼php指令碼中的comments也是不使用的

opcache.fast_shutdown “0” PHP_INI_SYSTEM

是否開啟快速關閉,

開啟時可使php在request shutdown時回收記憶體快

opcache.enable_file_override “0” PHP_INI_SYSTEM

如果置為1,則每次呼叫file_exist() is_file() is_readable()函式時,

opcache將要檢查該檔案是否被cache了,

這樣增加了檢查存在性和可讀性的開銷,

但避免了當validate_timestamps為disable時返回錯誤檔案狀態的風險。

opcache.optimization_level “0xffffffff” PHP_INI_SYSTEM 執行時控制優化的掩碼(幹什麼的?)
opcache.inherited_hack “1” PHP_INI_SYSTEM 5.3以前使用。5.3後廢棄
opcache.dups_fix “0” PHP_INI_ALL 為解決“cannot redecllare class” 時,可將其置為1
opcache.blacklist_filename “” PHP_INI_SYSTEM

設定黑名單檔案,符合黑名單檔案中定義的php檔案將不被opcache。黑名單檔案的例子如下:

; Matches a specific file.
/var/www/broken.php
; A prefix that matches all files starting with x.
/var/www/x
; A wildcard match.
/var/www/*-broken.php
一行為一條規則,支援萬用字元,註釋以分號開頭
opcache.max_file_size “0” PHP_INI_SYSTEM 被cache的檔案的最大size,單位bytes。0表示不限
opcache.consistency_checks “0” PHP_INI_ALL

如果置為N,N非零,則opcache會每N個請求核實一下cache的檢驗和。

這會損害效能,應該只在debug時使用

opcache.force_restart_timeout “180” PHP_INI_SYSTEM 如果opcache處於非active狀態,當N秒後opcache將自動重啟
opcache.error_log “” PHP_INI_SYSTEM opcache自身的errorlog檔案路徑,為空時則使用stderr
opcache.log_verbosity_level “1” PHP_INI_SYSTEM 日誌記錄level,預設只有fatal error和error
opcache.preferred_memory_model “” PHP_INI_SYSTEM

opcache首選使用的記憶體模型,為空時會選擇最適當的模型。

常用的有,mmap shm posix 和win32

opcache.protect_memory “0” PHP_INI_SYSTEM

執行php指令碼時保護共享記憶體防止意外的寫入。

只對debug時有用。