PHP 7.4.3 released

運行時配置

這些函數的行為受 php.ini 中的設置影響。

OPcache 配置選項
名字 默認 可修改范圍 更新日志
opcache.enable "1" PHP_INI_ALL  
opcache.enable_cli "0" PHP_INI_SYSTEM 在 PHP 7.1.2 至 7.1.6 (含)的版本,默認值是"1"
opcache.memory_consumption "128" PHP_INI_SYSTEM 在 PHP 7.0.0 之前,默認值是 "64"
opcache.interned_strings_buffer "8" PHP_INI_SYSTEM 在 PHP 7.0.0 之前,默認值是 "4"
opcache.max_accelerated_files "10000" PHP_INI_SYSTEM 在 PHP 7.0.0 之前,默認值是 "2000"
opcache.max_wasted_percentage "5" PHP_INI_SYSTEM  
opcache.use_cwd "1" PHP_INI_SYSTEM  
opcache.validate_timestamps "1" PHP_INI_ALL  
opcache.revalidate_freq "2" PHP_INI_ALL  
opcache.revalidate_path "0" PHP_INI_ALL  
opcache.save_comments "1" PHP_INI_SYSTEM  
opcache.load_comments "1" PHP_INI_ALL 從 PHP 7.0.0 開始被移除
opcache.fast_shutdown "0" PHP_INI_SYSTEM 從 PHP 7.2.0 開始被移除
opcache.enable_file_override "0" PHP_INI_SYSTEM  
opcache.optimization_level "0x7FFFBFFF" PHP_INI_SYSTEM 從 PHP 5.6.18 開始,默認值從 0xFFFFFFFF 修改為 0x7FFFBFFF
opcache.inherited_hack "1" PHP_INI_SYSTEM 自 PHP 7.3.0 被移除
opcache.dups_fix "0" PHP_INI_ALL  
opcache.blacklist_filename "" PHP_INI_SYSTEM  
opcache.max_file_size "0" PHP_INI_SYSTEM  
opcache.consistency_checks "0" PHP_INI_ALL  
opcache.force_restart_timeout "180" PHP_INI_SYSTEM  
opcache.error_log "" PHP_INI_SYSTEM  
opcache.log_verbosity_level "1" PHP_INI_SYSTEM  
opcache.preferred_memory_model "" PHP_INI_SYSTEM  
opcache.protect_memory "0" PHP_INI_SYSTEM  
opcache.mmap_base NULL PHP_INI_SYSTEM  
opcache.restrict_api "" PHP_INI_SYSTEM  
opcache.file_update_protection "2" PHP_INI_ALL  
opcache.huge_code_pages "0" PHP_INI_SYSTEM  
opcache.lockfile_path "/tmp" PHP_INI_SYSTEM  
opcache.opt_debug_level "0" PHP_INI_SYSTEM  
opcache.file_cache NULL PHP_INI_SYSTEM 從 PHP 7.0.0 開始支持
opcache.file_cache_only "0" PHP_INI_SYSTEM 從 PHP 7.0.0 開始支持
opcache.file_cache_consistency_checks "1" PHP_INI_SYSTEM 從 PHP 7.0.0 開始支持
opcache.file_cache_fallback "1" PHP_INI_SYSTEM 從 PHP 7.0.0 開始支持,僅適用于 Windows 平臺
opcache.validate_permission "0" PHP_INI_SYSTEM 從 PHP 7.0.14 開始支持
opcache.validate_root "0" PHP_INI_SYSTEM 從 PHP 7.0.14 開始支持
opcache.preload "" PHP_INI_SYSTEM 從 PHP 7.4.0 開始支持
opcache.preload_user "" PHP_INI_SYSTEM 從 PHP 7.4.0 開始支持
有關 PHP_INI_* 樣式的更多詳情與定義,見 配置可被設定范圍

這是配置指令的簡短說明。

opcache.enable boolean

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

opcache.enable_cli boolean

僅針對 CLI 版本的 PHP 啟用操作碼緩存。 通常被用來測試和調試。

opcache.memory_consumption integer

OPcache 的共享內存大小,以兆字節為單位。

opcache.interned_strings_buffer integer

用來存儲預留字符串的內存大小,以兆字節為單位。 PHP 5.3.0 之前的版本會忽略此配置指令。

opcache.max_accelerated_files integer

OPcache 哈希表中可存儲的腳本文件數量上限。 真實的取值是在質數集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個大于等于設置值的質數。 設置值取值范圍最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。

opcache.max_wasted_percentage integer

浪費內存的上限,以百分比計。 如果達到此上限,那么 OPcache 將產生重新啟動續發事件。

opcache.use_cwd boolean

如果啟用,OPcache 將在哈希表的腳本鍵之后附加改腳本的工作目錄, 以避免同名腳本沖突的問題。 禁用此選項可以提高性能,但是可能會導致應用崩潰。

opcache.validate_timestamps boolean

如果啟用,那么 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。 如果禁用此選項,你必須使用 opcache_reset() 或者 opcache_invalidate() 函數來手動重置 OPcache,也可以 通過重啟 Web 服務器來使文件系統更改生效。

opcache.revalidate_freq integer

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

如果 opcache.validate_timestamps 配置指令設置為禁用,那么此設置項將會被忽略。

opcache.revalidate_path boolean

如果禁用此選項,在同一個 include_path 已存在的緩存文件會被重用。 因此,將無法找到不在包含路徑下的同名文件。

opcache.save_comments boolean

如果禁用,腳本文件中的注釋內容將不會被包含到操作碼緩存文件, 這樣可以有效減小優化后的文件體積。 禁用此配置指令可能會導致一些依賴注釋或注解的 應用或框架無法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit。

opcache.load_comments boolean

如果禁用,則即使文件中包含注釋,也不會加載這些注釋內容。 本選項可以和 opcache.save_comments 一起使用,以實現按需加載注釋內容。

opcache.fast_shutdown boolean

如果啟用,則會使用快速停止續發事件。 所謂快速停止續發事件是指依賴 Zend 引擎的內存管理模塊 一次釋放全部請求變量的內存,而不是依次釋放每一個已分配的內存塊。

從 PHP 7.2.0 開始,此配置指令被移除。 快速停止的續發事件的處理已經集成到 PHP 中, 只要有可能,PHP 會自動處理這些續發事件。

opcache.enable_file_override boolean

如果啟用,則在調用函數 file_exists()is_file() 以及 is_readable() 的時候, 都會檢查操作碼緩存,無論文件是否已經被緩存。 如果應用中包含檢查 PHP 腳本存在性和可讀性的功能,這樣可以提升性能。 但是如果禁用了 opcache.validate_timestamps 選項, 可能存在返回過時數據的風險。

opcache.optimization_level integer

控制優化級別的二進制位掩碼。

opcache.inherited_hack boolean

在 PHP 5.3 之前的版本,OPcache 會存儲代碼中使用 DECLARE_CLASS 操作碼 來實現繼承的位置。當文件被加載之后,OPcache 會嘗試使用當前環境來綁定被繼承的類。 由于當前腳本中可能并不需要 DECLARE_CLASS 操作碼,如果這樣的腳本需要對應的操作碼被定義時, 可能無法運行。

在 PHP 5.3 及后續版本中,此配置指令會被忽略。

opcache.dups_fix boolean

僅作為針對 “不可重定義類”錯誤的一種解決方案。

opcache.blacklist_filename string

OPcache 黑名單文件位置。 黑名單文件為文本文件,包含了不進行預編譯優化的文件名,每行一個文件名。 黑名單中的文件名可以使用通配符,也可以使用前綴。 此文件中以分號(;)開頭的行將被視為注釋。

簡單的黑名單文件可能如下所示:

; 將特定文件加入到黑名單
/var/www/broken.php
; 以字符 x 文件打頭的文件
/var/www/x
; 通配符匹配
/var/www/*-broken.php
opcache.max_file_size integer

以字節為單位的緩存的文件大小上限。設置為 0 表示緩存全部文件。

opcache.consistency_checks integer

如果是非 0 值,OPcache 將會每隔 N 次請求檢查緩存校驗和。 N 即為此配置指令的設置值。 由于此選項對于性能有較大影響,請盡在調試環境使用。

opcache.force_restart_timeout integer

如果緩存處于非激活狀態,等待多少秒之后計劃重啟。 如果超出了設定時間,則 OPcache 模塊將殺除持有緩存鎖的進程, 并進行重啟。

如果選項 opcache.log_verbosity_level 設置為 2 或者 2 以上的數值,當發生重啟時將在日志中記錄一條警告信息。

opcache.error_log string

OPcache 模塊的錯誤日志文件。 如果留空,則視為 stderr, 錯誤日志將被送往標準錯誤輸出 (通常情況下是 Web 服務器的錯誤日志文件)。

opcache.log_verbosity_level integer

OPcache 模塊的日志級別。 默認情況下,僅有致命級別(0)及錯誤級別(1)的日志會被記錄。 其他可用的級別有:警告(2),信息(3)和調試(4)。

opcache.preferred_memory_model string

OPcache 首選的內存模塊。 如果留空,OPcache 會選擇適用的模塊, 通常情況下,自動選擇就可以滿足需求。

可選值包括: mmapshm, posix 以及 win32

opcache.protect_memory boolean

保護共享內存,以避免執行腳本時發生非預期的寫入。 僅用于內部調試。

opcache.mmap_base string

在 Windows 平臺上共享內存段的基地址。 所有的 PHP 進程都將共享內存映射到同樣的地址空間。 使用此配置指令避免“無法重新附加到基地址”的錯誤。

opcache.restrict_api string

僅允許路徑是以指定字符串開始的 PHP 腳本調用 OPcache API 函數。 默認值為空字符串 "",表示不做限制。

opcache.file_update_protection string

如果文件的最后修改時間距現在不足此項配置指令所設定的秒數,那么這個文件不會進入到緩存中。 這是為了防止尚未完全修改完畢的文件進入到緩存。 如果你的應用中不存在部分修改文件的情況,把此項設置為 0 可以提高性能。

opcache.huge_code_pages string

啟用或者禁用將 PHP 代碼(文本段)拷貝到 HUGE PAGES 中。 此項配置指令可以提高性能,但是需要在 OS 層面進行對應的配置。

opcache.lockfile_path string

用來存儲共享鎖文件的絕對路徑(僅適用于 *nix 操作系統)。

opcache.opt_debug_level string

出于對不同階段的優化情況進行調試的目的,生成操作碼轉儲。 設置為 0x10000 會在進行優化之前輸出編譯器編譯后的操作碼, 設置為 0x20000 會輸出優化后的操作碼。

opcache.file_cache string

配置二級緩存目錄并啟用二級緩存。 啟用二級緩存可以在 SHM 內存滿了、服務器重啟或者重置 SHM 的時候提高性能。 默認值為空字符串 "",表示禁用基于文件的緩存。

opcache.file_cache_only boolean

啟用或禁用在共享內存中的 opcode 緩存。

opcache.file_cache_consistency_checks boolean

當從文件緩存中加載腳本的時候,是否對文件的校驗和進行驗證。

opcache.file_cache_fallback boolean

在 Windows 平臺上,當一個進程無法附加到共享內存的時候, 使用基于文件的緩存,也即:opcache.file_cache_only=1。 需要顯示的啟用文件緩存。

Caution

不鼓勵禁用此配置項, 禁用它可能會導致進程無法啟動。

opcache.validate_permission boolean

針對當前用戶,驗證緩存文件的訪問權限。

opcache.validate_root boolean

在 chroot 的環境中避免命名沖突。 為了防止進程訪問到 chroot 環境之外的文件,應該在 chroot 的情況下啟用這個選項。

opcache.preload string

指定要在服務器啟動時期進行編譯和緩存的 PHP 腳本文件, 這些文件也可能通過 include 或者 opcache_compile_file() 函數 來預加載其他文件。 所有這些文件中包含的實體,包括函數、類等,在服務器啟動的時候就被加載和緩存, 對于用戶代碼來講是“開箱可用”的。

opcache.preload_user string

考慮到安全因素,禁止以 root 用戶預加載代碼。該指令方便以其他用戶預加載。

add a note add a note

User Contributed Notes 7 notes

up
13
damien at overeem dot org
3 years ago
When using PHP on a windows platform and enabling opcache, you might run into occasional 500 errors. These will appear to show up entirely random.

When this happens, your windows Event log (Windows Logs/Application) will show (probably multiple)  entries from Zend OPcache with Event ID 487. Further information will state the following error message: "Base address marks unusable memory region".

This issue can be resolved by adding the following to your php.ini:

    opcache.mmap_base = 0x20000000

Unfortunately I do not know the significance of the value "0x20000000". I can only tell you that this value works to solve the problem (Tried and tested)
up
4
wessos at example dot org
1 year ago
The optimization levels as of php 7.3 are the following:

#define ZEND_OPTIMIZER_PASS_1        (1<<0)   /* CSE, STRING construction     */
#define ZEND_OPTIMIZER_PASS_2        (1<<1)   /* Constant conversion and jumps */
#define ZEND_OPTIMIZER_PASS_3        (1<<2)   /* ++, +=, series of jumps      */
#define ZEND_OPTIMIZER_PASS_4        (1<<3)   /* INIT_FCALL_BY_NAME -> DO_FCALL */
#define ZEND_OPTIMIZER_PASS_5        (1<<4)   /* CFG based optimization       */
#define ZEND_OPTIMIZER_PASS_6        (1<<5)   /* DFA based optimization       */
#define ZEND_OPTIMIZER_PASS_7        (1<<6)   /* CALL GRAPH optimization      */
#define ZEND_OPTIMIZER_PASS_8        (1<<7)   /* SCCP (constant propagation)  */
#define ZEND_OPTIMIZER_PASS_9        (1<<8)   /* TMP VAR usage                */
#define ZEND_OPTIMIZER_PASS_10        (1<<9)   /* NOP removal                 */
#define ZEND_OPTIMIZER_PASS_11        (1<<10)  /* Merge equal constants       */
#define ZEND_OPTIMIZER_PASS_12        (1<<11)  /* Adjust used stack           */
#define ZEND_OPTIMIZER_PASS_13        (1<<12)  /* Remove unused variables     */
#define ZEND_OPTIMIZER_PASS_14        (1<<13)  /* DCE (dead code elimination) */
#define ZEND_OPTIMIZER_PASS_15        (1<<14)  /* (unsafe) Collect constants */
#define ZEND_OPTIMIZER_PASS_16        (1<<15)  /* Inline functions */

Source: https://lxr.room11.org/xref/php-src%40master/ext/opcache/Optimizer/zend_optimizer.h
up
3
tizian dot schmidlin at gmail dot com
10 months ago
It should be noted that according to the original RFC (https://wiki.php.net/rfc/preload) `opcache.preload` caches preloaded files *forever* for all instances of the underlying PHP process.

That means, that hosting multiple websites on the same server might result in some unexpected behaviour.

Concrete example:
- you have a Symfony 3.2 App (which might be an endpoint of some type) and a Symfony 3.4 App (which might be your main application)
- both apps have a main Class called App that is in the same namespace (as it is usual, since the class name is unique to each project)
- depending on which app is loaded first, one or the other will work, since `opcache.preload` has no file based distinction of what class is used where and simply provides them to the user space

This is avoidable by simply not preloading user space classes or, if you work with FPM, by defining a pool for each app.

In order to optimize memory consumption, you might also use a common FPM Pool for all Symfony 3.4 Apps and preload the entire framework in there and simply not preload user space classes (which might be cached by opcache anyway but is slower, since it will be checked if the file has changed on every request).
up
3
bdurand at ensemblegroup dot net
3 years ago
It would appear as though the [opcache.enable] setting is indeed NOT PHP_INI_ALL.
For changing it within user.ini yields no effect when disabled at global level. user.ini is ignored for that setting.
up
0
carneiro at isharelife dot com dot br
1 month ago
If you try to allocate more memory that is available using opcache.memory_consumption PHP stops working without any logs to help on debugging. This issue took me 4 hours to solve when creating a staging server with same configrations and less memory that was available on production server.
up
-7
paul dot lindgreen at msvu dot ca
1 year ago
Is opcache.memory_consumption limited by max_memory? If not what limitations are there, can you have too much?
up
-10
BR
4 years ago
opcache.max_wasted_percentage must have a value between 1 and 50. Otherwise it will automatically set the variable 5 %.
To Top 飞禽走兽玩法