PHP 5.5已经发布了,它有一个新的代码缓存模块OPCache,但是似乎没有任何关于它的文档。
它的文档在哪里,如何使用OPcache?
PHP 5.5已经发布了,它有一个新的代码缓存模块OPCache,但是似乎没有任何关于它的文档。
它的文档在哪里,如何使用OPcache?
当前回答
OPcache取代APC
因为OPcache被设计用来取代APC模块,所以在PHP中不可能并行运行它们。这对于缓存PHP操作码是很好的,因为它不会影响您编写代码的方式。
然而,这意味着如果你目前正在使用APC来存储其他数据(通过apc_store()函数),如果你决定使用OPCache,你将无法做到这一点。
您将需要使用另一个库,如APCu或Yac,它们都将数据存储在共享的PHP内存中,或者切换到使用像memcached这样的库,它将数据存储在内存中的一个单独的PHP进程中。
另外,OPcache没有APC中所存在的上传进度表的等价物。相反,您应该使用会话上传进度。
OPcache设置
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取代APC
因为OPcache被设计用来取代APC模块,所以在PHP中不可能并行运行它们。这对于缓存PHP操作码是很好的,因为它不会影响您编写代码的方式。
然而,这意味着如果你目前正在使用APC来存储其他数据(通过apc_store()函数),如果你决定使用OPCache,你将无法做到这一点。
您将需要使用另一个库,如APCu或Yac,它们都将数据存储在共享的PHP内存中,或者切换到使用像memcached这样的库,它将数据存储在内存中的一个单独的PHP进程中。
另外,OPcache没有APC中所存在的上传进度表的等价物。相反,您应该使用会话上传进度。
OPcache设置
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在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指令而不是“正常”扩展指令,因为它会影响实际的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
我是这个项目的作者
特点:
OpCache状态 OpCache配置 OpCache统计 OpCache重置 缓存脚本概述 缓存脚本失效 多语言 移动设备支持 闪亮的图
截图:
URL: https://github.com/PeeHaa/OpCacheGUI
opcache-status
特点:
OpCache状态 OpCache配置 OpCache统计 缓存脚本概述 单独的文件
截图:
URL: https://github.com/rlerdorf/opcache-status
opcache-gui
特点:
OpCache状态 OpCache配置 OpCache统计 OpCache重置 缓存脚本概述 缓存脚本失效 自动刷新
截图:
URL: https://github.com/amnuts/opcache-gui
我将对我使用opcache的情况发表我的意见。
我已经做了一个广泛的框架,有很多字段和验证方法和枚举,以便能够与我的数据库对话。
没有opcache
在没有opcache的情况下使用这个脚本时,我在2.8秒内向apache服务器推送了9000个请求,它在70-80秒内以90-100%的cpu达到最大值,直到它赶上所有的请求。
总耗时:76085毫秒(76秒)
启用opcache后
启用opcache后,它以25-30%的cpu时间运行大约25秒,cpu使用率永远不会超过25%。
总用时:26490毫秒(26秒)
我已经做了一个opcache黑名单文件来禁用除框架之外的所有缓存,框架都是静态的,不需要改变功能。我只显式地选择框架文件,这样我就可以进行开发,而不必担心重新加载/验证缓存文件。缓存所有内容可以在请求总数25546毫秒上节省一秒钟的时间
这大大增加了我每秒可以处理的数据/请求量,而服务器甚至不需要付出任何代价。
在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
Intl -> http://php.net/manual/en/book.intl.php