关于opcache

php5.5.14,lnmp安装opcache。虽然php5.5默认集成了opcache,但编译时仍需使用 --enable-opcache 选项来开启OPcache。

行动

本次使用upgrade_php.sh进行php更新。

  1. 由于之前已经将lnmp的php版本升级到了5.5.14,故先将版本检查注释掉:
    #       if [ "$php_version" == "$old_php_version" ]; then
    #               echo "Error: The upgrade PHP Version is the same as the old Version!!"
    #               exit 1
    #       fi
  2. 再加上--enable-opcache,在所有./configure的最后加入--enable-opcache
  3. sh upgrade_php.sh,输入5.5.14

编译完成后,生成的so文件在:/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/opcache.so,在php.ini的[opcache]下加入:

zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20121212/opcache.so

重启php-fpm,然后再phpinfo里面看到Zend OPcache这个就是安装成功了。这里面有两个值比较重要:

参数解释

  • Cache hits 缓存命中
  • Cache misses 缓存未命中

phpinfo里面看到Cache hits为0,Cache misses为1。刷新页面,看到Cache hits变为1了,再刷新,会一直累加。

然后来看一下OPcache的参数含义:

OPcache 配置选项

名字 默认 可修改范围 说明
opcache.enable "1" PHP_INI_ALL 启用操作码缓存。如果禁用此选项,则不会优化和缓存代码。在运行期使用 ini_set() 函数只能禁用 opcache.enable 设置,不可以启用此设置。如果在脚本中尝试启用此设置项会产生警告。
opcache.enable_cli "0" PHP_INI_SYSTEM 仅针对 CLI 版本的 PHP 启用操作码缓存。通常被用来测试和调试。
opcache.memory_consumption "64" PHP_INI_SYSTEM OPcache 的共享内存大小,以兆字节为单位。
opcache.interned_strings_buffer "4" PHP_INI_SYSTEM 用来存储临时字符串的内存大小,以兆字节为单位。自 PHP 5.3.0 可用。
opcache.max_accelerated_files "2000" PHP_INI_SYSTEM OPcache 哈希表中可存储的脚本文件数量上限。真实的取值是在质数集合{ 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 }中找到的第一个比设置值大的质数。设置值的取值范围是 200 到 100000 之间。
opcache.max_wasted_percentage "5" PHP_INI_SYSTEM 浪费内存的上限,以百分比计。如果达到此上限,那么 OPcache 将产生重新启动续发事件。
opcache.use_cwd "1" PHP_INI_SYSTEM 如果启用,OPcache 将在哈希表的脚本键之后附加改脚本的工作目录,以避免同名脚本冲突的问题。禁用此选项可以提高性能,但是可能会导致应用崩溃。
opcache.validate_timestamps "1" PHP_INI_ALL 如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数检查脚本是否更新。如果禁用此选项,你必须使用 opcache_reset() 或者opcache_invalidate() 函数来手动重置 OPcache,也可以通过重启 Web 服务器来使文件系统更改生效。
opcache.revalidate_freq "2" PHP_INI_ALL 检查脚本时间戳是否有更新的周期,以秒为单位。 设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新。如果 opcache.validate_timestamps 配置指令设置为禁用,那么此设置项将会被忽略。
opcache.revalidate_path "0" PHP_INI_ALL 如果禁用此选项,在同一个 include_path 已存在的缓存文件会被重用。因此,将无法找到不在包含路径下的同名文件。
opcache.save_comments "1" PHP_INI_SYSTEM 如果禁用,脚本文件中的注释内容将不会被包含到操作码缓存文件, 这样可以有效减小优化后的文件体积。禁用此配置指令可能会导致一些依赖注释或注解的应用或框架无法正常工作,比如: Doctrine, Zend Framework 2 以及 PHPUnit。
opcache.load_comments "1" PHP_INI_ALL 如果禁用,则即使文件中包含注释,也不会加载这些注释内容。本选项可以和 opcache.save_comments一起使用,以实现按需加载注释内容。
opcache.fast_shutdown "0" PHP_INI_SYSTEM 如果启用,则会使用快速停止续发事件。所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。
opcache.enable_file_override "0" PHP_INI_SYSTEM 如果启用,则在调用函数 file_exists(),is_file() 以及 is_readable() 的时候,都会检查操作码缓存,无论文件是否已经被缓存。如果应用中包含检查 PHP 脚本存在性和可读性的功能,这样可以提升性能。但是如果禁用了 opcache.validate_timestamps 选项,可能存在返回过时数据的风险。
opcache.optimization_level "0xffffffff" PHP_INI_SYSTEM 控制优化级别的二进制位掩码。
opcache.inherited_hack "1" PHP_INI_SYSTEM 在 PHP 5.3 之前的版本,OPcache 会存储代码中使用 DECLARE_CLASS 操作码 来实现继承的位置。当文件被加载之后,OPcache 会尝试使用当前环境来绑定被继承的类。 由于当前脚本中可能并不需要 DECLARE_CLASS 操作码,如果这样的脚本需要对应的操作码被定义时,可能无法运行。在 PHP 5.3 及后续版本中,此配置指令会被忽略。
opcache.dups_fix "0" PHP_INI_ALL 仅作为针对 “不可重定义类”错误的一种解决方案。
opcache.blacklist_filename "" PHP_INI_SYSTEM OPcache 黑名单文件位置。 黑名单文件为文本文件,包含了不进行预编译优化的文件名,每行一个文件名。 黑名单中的文件名可以使用通配符,也可以使用前缀。 此文件中以分号(;)开头的行将被视为注释。
opcache.max_file_size "0" PHP_INI_SYSTEM 以字节为单位的缓存的文件大小上限。设置为 0 表示缓存全部文件。
opcache.consistency_checks "0" PHP_INI_ALL 如果是非 0 值,OPcache 将会每隔 N 次请求检查缓存校验和。N 即为此配置指令的设置值。由于此选项对于性能有较大影响,请尽在调试环境使用。
opcache.force_restart_timeout "180" PHP_INI_SYSTEM 如果缓存处于非激活状态,等待多少秒之后计划重启。 如果超出了设定时间,则 OPcache 模块将杀除持有缓存锁的进程, 并进行重启。如果选项 opcache.log_verbosity_level 设置为 3 或者 3 以上的数值,当发生重启时将在日志中记录一条错误信息。
opcache.error_log "" PHP_INI_SYSTEM OPcache 模块的错误日志文件。如果留空,则视为 stderr,错误日志将被送往标准错误输出 (通常情况下是 Web 服务器的错误日志文件)。
opcache.log_verbosity_level "1" PHP_INI_SYSTEM OPcache 模块的日志级别。默认情况下,仅有致命级别(0)及错误级别(1)的日志会被记录。其他可用的级别有:警告(2),信息(3)和调试(4)。
opcache.preferred_memory_model "" PHP_INI_SYSTEM OPcache 首选的内存模块。 如果留空,OPcache 会选择适用的模块, 通常情况下,自动选择就可以满足需求。可选值包括: mmap,shm, posix 以及 win32。
opcache.protect_memory "0" PHP_INI_SYSTEM 保护共享内存,以避免执行脚本时发生非预期的写入。仅用于内部调试。
opcache.mmap_base NULL PHP_INI_SYSTEM 在 Windows 平台上共享内存段的基地址。所有的 PHP 进程都将共享内存映射到同样的地址空间。使用此配置指令避免“无法重新附加到基地址”的错误。

性能测试

以下是Hisune MVC开启opcache和关闭opcache的Hello world性能测试:

未开启opcache

Memory Usage
111,264 bytes 
337,240 bytes (process) 
524,288 bytes (process peak)
Execution Time
0.00229 seconds

开启opcache

Memory Usage
33,664 bytes 
254,304 bytes (process) 
262,144 bytes (process peak)
Execution Time
0.00032 seconds

可适当增加opcache.revalidate_freq的值,默认为2,改为了60。需要注意的是,如果opcache.revalidate_freq改为了60,web端访问已进行修改的php文件将会在60秒后才能看到效果。

推荐配置

顺便贴一下鸟哥的opcache推荐配置:

opcache.enable_cli=1
opcache.memory_consumption=128 // 共享内存大小, 这个根据你们的需求可调
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60 // 60s检查一次文件更新
opcache.fast_shutdown=1 // 打开这个内存的速度会提高
opcache.save_comments=0

如果您觉得您在我这里学到了新姿势,博主支持转载,姿势本身就是用来相互学习的。同时,本站文章如未注明均为 hisune 原创 请尊重劳动成果 转载请注明 转自: php opcache安装配置和性能测试 - hisune.com