php高并发优化之一:opcache,opcache参数配置

opache作为一个编译缓存,在php5.5之后就加入了整合进了php,但是需要自己手动开启,其原理如下:

PHP执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)

  1. Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
  2. Parsing, 将Tokens转换成简单而有意义的表达式
  3. Compilation, 将表达式编译成Opocdes
  4. Execution, 在zend虚拟机中顺次执行Opcodes,每次一条,从而实现PHP脚本的功能

opcache的作用就是缓存第三部的结果,经过测试,对我们php服务器的qps提升5倍以上(数据仅供参考)。

贴个php.ini的配置

[opcache]
;加载扩展
zend_extension = "opcache.so"
;如果有加载扩展的话,需要设置为1开启
opcache.enable=1

; 这个选项的默认值为64MB,我把它设置为192MB,因为我的代码很大。
;你可以通过调用opcache_get_status ()来获取opcache使用的内存的总量,如果内存不足,你可以把这个选项设置得更大一些。
opcache.memory_consumption=128

; 这是一个很有用的选项,但是似乎完全没有文档说明。PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。
;例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。
;这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。
;在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。
opcache.interned_strings_buffer=8

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 100000 are allowed.
opcache.max_accelerated_files=7963

; 会在这个周期去检测代码是否有改变,有改变则重新生成opcode
opcache.revalidate_freq=60

; 是否保存注释
opcache.save_comments=0

; 快速重启,重启fpm的时候有用
opcache.fast_shutdown=1
opcache开启的话,还有几个函数需要注意
  • opcache_compile_file — 无需运行,即可编译并缓存 PHP 脚本
  • opcache_get_configuration — 获取缓存的配置信息
  • opcache_get_status — 获取缓存的状态信息
  • opcache_invalidate — 废除脚本缓存,清除掉指定脚本的缓存
  • opcache_is_script_cached — Tells whether a script is cached in OPCache
  • opcache_reset — 重置字节码缓存的内容

opcache_get_status 中关键的参数如下

    [opcache_enabled] => 1
    [cache_full] => 
    [restart_pending] => 
    [restart_in_progress] => 
    [memory_usage] => Array
        (
            [used_memory] => 38303528  //使用的内存 单位是b
            [free_memory] => 95914200 //剩余的内存
            [wasted_memory] => 0
            [current_wasted_percentage] => 0
        )

    [interned_strings_usage] => Array
        (
            [buffer_size] => 8388608 
            [used_memory] => 4924664
            [free_memory] => 3463944 //变量驻留剩余内存,和interned_strings_buffer挂钩
            [number_of_strings] => 49047
        )

    [opcache_statistics] => Array
        (
            [num_cached_scripts] => 981
            [num_cached_keys] => 991
            [max_cached_keys] => 7963
            [hits] => 506388
            [start_time] => 1497930042
            [last_restart_time] => 0
            [oom_restarts] => 0
            [hash_restarts] => 0
            [manual_restarts] => 0
            [misses] => 1003
            [blacklist_misses] => 0
            [blacklist_miss_ratio] => 0
            [opcache_hit_rate] => 99.802322075086  //命中率,关键参数
        )
发布于