PHP 5.5 已经发布,它具有一个名为 OPCache 的新代码缓存模块,但似乎没有任何文档。
那么它的文档在哪里以及如何使用 OPcache?
OpCache 在 PHP5.5+ 上默认编译。但是默认情况下它是禁用的。为了开始在 PHP5.5+ 中使用 OpCache,您首先必须启用它。为此,您必须执行以下操作。
将以下行添加到您的php.ini
:
zend_extension=/full/path/to/opcache.so (nix)
zend_extension=C:\path\to\php_opcache.dll (win)
请注意,当路径包含空格时,您应该将其用引号括起来:
zend_extension="C:\Program Files\PHP5.5\ext\php_opcache.dll"
另请注意,您必须使用该zend_extension
指令而不是“普通”extension
指令,因为它会影响实际的 Zend 引擎(即运行 PHP 的东西)。
目前,您可以使用四个功能:
opcache_get_configuration()
:返回一个包含 OpCache 当前使用的配置的数组。这包括所有 ini 设置以及版本信息和列入黑名单的文件。
var_dump(opcache_get_configuration());
opcache_get_status()
:这将返回一个数组,其中包含有关缓存当前状态的信息。此信息将包括:缓存的状态(启用、重新启动、已满等)、内存使用情况、命中、未命中和一些更有用的信息。它还将包含缓存的脚本。
var_dump(opcache_get_status());
opcache_reset()
:重置整个缓存。这意味着所有可能的缓存脚本将在下次访问时再次解析。
opcache_reset();
opcache_invalidate()
:使特定的缓存脚本无效。这意味着脚本将在下次访问时再次解析。
opcache_invalidate('/path/to/script/to/invalidate.php', true);
创建了一些 GUI 来帮助维护 OpCache 并生成有用的报告。这些工具利用了上述功能。
OpCacheGUI
免责声明我是这个项目的作者
特征:
截图:
网址:https ://github.com/PeeHaa/OpCacheGUI
opcache-状态
特征:
截屏:
网址:https ://github.com/rlerdorf/opcache-status
opcache-gui
特征:
截屏:
因为 OPcache 是为替换 APC 模块而设计的,所以无法在 PHP 中并行运行它们。这对于缓存 PHP 操作码很好,因为它们都不会影响您编写代码的方式。
然而,这意味着如果您当前正在使用 APC 来存储其他数据(通过该apc_store()
功能),那么如果您决定使用 OPCache,您将无法做到这一点。
您将需要使用另一个库,例如APCu或Yac,它们都将数据存储在共享的 PHP 内存中,或者切换到使用 memcached 之类的东西,它将数据存储在与 PHP 不同的进程中的内存中。
此外,OPcache 没有与 APC 中的上传进度表等效的功能。相反,您应该使用Session Upload Progress。
可以在此处找到 OPcache 的文档以及此处列出的所有配置选项。推荐的设置是:
; Sets how much memory to use
opcache.memory_consumption=128
;Sets how much memory should be used by OPcache for storing internal strings
;(e.g. classnames and the files they are contained in)
opcache.interned_strings_buffer=8
; The maximum number of files OPcache will cache
opcache.max_accelerated_files=4000
;How often (in seconds) to check file timestamps for changes to the shared
;memory storage allocation.
opcache.revalidate_freq=60
;If enabled, a fast shutdown sequence is used for the accelerated code
;The fast shutdown sequence doesn't free each allocated block, but lets
;the Zend Engine Memory Manager do the work.
opcache.fast_shutdown=1
;Enables the OPcache for the CLI version of PHP.
opcache.enable_cli=1
如果您使用任何使用代码注释的库或代码,您必须启用保存注释:
opcache.save_comments=1
如果禁用,所有 PHPDoc 注释将从代码中删除以减小优化代码的大小。禁用“Doc Comments”可能会破坏一些现有的应用程序和框架(例如 Doctrine、ZF2、PHPUnit)
我要为我使用 opcache 的东西付出两分钱。
我已经制作了一个包含大量字段、验证方法和枚举的广泛框架,以便能够与我的数据库对话。
没有 opcache
当在没有 opcache 的情况下使用这个脚本并且我在 2.8 秒内将 9000 个请求推送到 apache 服务器时,它会在 70-80 秒内以 90-100% cpu 的速度最大化,直到它赶上所有请求。
Total time taken: 76085 milliseconds(76 seconds)
启用 opcache
启用 opcache 后,它以 25-30% 的 cpu 时间运行大约 25 秒,并且永远不会超过 25% 的 cpu 使用率。
Total time taken: 26490 milliseconds(26 seconds)
我制作了一个 opcache 黑名单文件来禁用所有内容的缓存,除了框架是静态的并且不需要更改功能。我只为框架文件明确选择,这样我就可以开发而不用担心重新加载/验证缓存文件。缓存所有内容可以节省一秒钟的请求总数25546 milliseconds
这显着扩展了我每秒可以处理的数据/请求的数量,而服务器甚至不会出汗。
在 Amazon Linux 上使用 PHP 5.6(在 RedHat 或 CentOS 上应该相同):
yum install php56-opcache
然后重新启动apache。
我在设置moodle时遇到了这个问题。我在 php.ini 文件中添加了以下行。
zend_extension=C:\xampp\php\ext\php_opcache.dll
[opcache]
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60
; Required for Moodle
opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0
; If something does not work in Moodle
;opcache.revalidate_path = 1 ; May fix problems with include paths
;opcache.mmap_base = 0x20000000 ; (Windows only) fix OPcache crashes with event id 487
; Experimental for Moodle 2.6 and later
;opcache.fast_shutdown = 1
;opcache.enable_cli = 1 ; Speeds up CLI cron
;opcache.load_comments = 0 ; May lower memory use, might not be compatible with add-ons and other apps
extension=C:\xampp\php\ext\php_intl.dll
[intl]
intl.default_locale = en_utf8
intl.error_level = E_WARNING