分类: Linux
opcache参数配置优化详解

我们在日常的PHP开发过程中,应该经常会听见Opcache这个词,那么啥是Opcode呢?
Install-OPcache-in-CentOS-7.png
Opcache 的前生是 Optimizer+ ,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件。 Optimizer+ 将PHP代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。同时,它还应用了一些代码优化模式,使得代码执行更快。从而加速PHP的执行。

Optimizer+ 于 2013年3月中旬改名为 Opcache。并且在 PHP License 下开源: https://github.com/zendtech/ZendOptimizerPlus

Opcache的生命周期
了解了啥是Opcache以及Opcache的作用。现在看一下Opcache的运行图。

正常的php代码的执行过程如下:
006tKfTcgy1fnqjaiczadj30ru03qmxp.jpg

request请求(nginx,apache,cli等)-->Zend引擎读取.php文件-->扫描其词典和表达式 -->解析文件-->创建要执行的计算机代码(称为Opcode)-->最后执行Opcode--> response 返回
每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重行生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:
006tKfTcgy1fnqm3alma3j30na08ijs3.jpg

request请求(nginx,apache,cli等)-->Zend引擎读取.php文件-->读取Opcode-->执行Opcode--> response 返回
Opcache的安装
实际上,在php5.5以后,Opcache 是默认安装好了的,已经不需要我们再手动去安装了,但是默认是没有开启的,如果我们需要使用,需要手动去开启:

zend_extension=opcache.so
[opcache]
opcache.enable=1  #允许在web环境使用,默认是开启的。
opcache.enable_cli=1 #运行在cli环境使用
重启 fpm 和 nginx

kill -USR2 cat `/usr/local/php/var/run/php-fpm.pid`
nginx -s reload

推荐的php.ini设置

使用下列推荐设置来获得较好的性能:

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1 ;(在PHP 7.2.0中被移除,会自动开启)
opcache.enable_cli=1
opcache.save_comments=0
opcache的配置说明

; opcache的开关,关闭时代码不再优化.
opcache.enable=1
 
; Determines if Zend OPCache is enabled for the CLI version of PHP
opcache.enable_cli=1
 
; OPcache的共享内存大小,以兆字节为单位。总共能够存储多少预编译的PHP代码(单位:MB)
; 推荐128
opcache.memory_consumption=64
 
; 用来存储临时字符串的内存大小,以兆字节为单位.
; 推荐8
opcache.interned_strings_buffer=4
;这是一个很有用的选项,但是似乎完全没有文档说明。PHP使用了一种叫做字符串驻留(string interning)的技术来改善性能。例如,如果你在代码中使用了1000次字符串“foobar”,在PHP内部只会在第一使用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次使用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情况下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的应用中,这可以非常有效地节约内存,提高应用的性能。
这个选项的值是以兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MB,这是一个比较低的值。
 
; 最大缓存的文件数目200到100000之间.
; 推荐4000
opcache.max_accelerated_files=2000
 
; 内存"浪费"达到此值对应的百分比,就会发起一个重启调度.
opcache.max_wasted_percentage=5
 
; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上,以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能,但是会对已存在的应用造成破坏.
opcache.use_cwd=0
 
; 开启文件时间戳验证
opcache.validate_timestamps=1
opcache.validate_timestamps (default "1")
;如果启用(设置为1),OPcache会在opcache.revalidate_freq设置的秒数去检测文件的时间戳(timestamp)检查脚本是否更新。
 
; 检查脚本时间戳是否有更新的周期,以秒为单位。设置为<i>0</i>会导致针对每个请求,OPcache都会检查脚本更新.
; 推荐60
opcache.revalidate_freq=2
opcache.revalidate_freq (default "2")
;这个选项用于设置缓存的过期时间(单位是秒),当这个时间达到后,opcache会检查你的代码是否改变,如果改变了PHP会重新编译它,生成新的opcode,并且更新缓存。值为“0”表示每次请求都会检查你的PHP代码是否更新(这意味着会增加很多次stat系统调用,译注:stat系统调用是读取文件的状态,这里主要是获取最近修改时间,这个系统调用会发生磁盘I/O,所以必然会消耗一些CPU时间,当然系统调用本身也会消耗一些CPU时间)。可以在开发环境中把它设置为0,生产环境下不用管。
 
; 允许或禁止在include_path中进行文件搜索的优化.
opcache.revalidate_path=0
;在include_path优化中启用或禁用文件搜索
如果被禁用,并且找到了使用的缓存文件相同的include_path,该文件不被再次搜索。因此,如果一个文件与include_path中的其他地方相同的名称出现将不会被发现。如果此优化对此有效,请启用此指令你的应用程序,这个指令的默认值是禁用的,这意味着该优化是活跃的。
 
; 如果禁用,脚本文件中的注释内容将不会被包含到操作码缓存文件,这样可以有效减小优化后的文件体积,禁用此配置指令可能会导致一些依赖注释或注解的应用或框架无法正常工作,比如:Doctrine,Zend Framework2等.
; 推荐0
opcache.save_comments=1
 
; 如果禁用,则即使文件中包含注释,也不会加载这些注释内容。本选项可以和opcache.save_comments一起使用,以实现按需加载注释内容.
opcache.load_comments=1
 
; 打开快速关闭,打开这个在PHP Request Shutdown的时候会收内存的速度会提高.
; 推荐1
opcache.fast_shutdown=1
opcache.fast_shutdown(默认“0”)
;如果启用,则会使用快速停止续发事件。 所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块 一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。
该指令已在PHP 7.2.0中被删除。快速关机序列的一个变种已经被集成到PHP中,并且如果可能的话将被自动使用。
 
; 允许覆盖文件存在(file_exists等)的优化特性.
opcache.enable_file_override=0 
 
; 定义启动多少个优化过程.
opcache.optimization_level=0xffffffff
 
; 启用此Hack可以暂时性的解决"can’t redeclare class"错误.
opcache.inherited_hack=1
 
; 启用此Hack可以暂时性的解决"can’t redeclare class"错误.
;opcache.dups_fix=0
 
; 通过文件大小屏除大文件的缓存,默认情况下所有的文件都会被缓存.
;opcache.max_file_size=0
 
; 每N次请求检查一次缓存校验.默认值0表示检查被禁用了,由于计算校验值有损性能,这个指令应当紧紧在开发调试的时候开启.
;opcache.consistency_checks=0
 
; 从缓存不被访问后,等待多久后(单位为秒)调度重启.
;opcache.force_restart_timeout=180
 
; 日志记录level,默认只有fatal error和error.
;opcache.error_log=
 
; 将错误信息写入到服务器(Apache等)日志
;opcache.log_verbosity_level=1
 
; 内存共享的首选后台.留空则是让系统选择.
;opcache.preferred_memory_model=
 
; 运行php脚本时保护共享内存防止意外的写入,只对debug时有用.
;opcache.protect_memory=0

via:https://www.zybuluo.com/phper/note/1016714
http://www.ywnds.com/?p=5396
http://bikong0411.github.io/2016/09/21/zend-opcache-best-setting.html
https://www.scalingphpbook.com/blog/2014/02/14/best-zend-opcache-settings.html


相关博文:

发表新评论