今儿在azure里装php5.5.4得瑟,发现原先php5.4、php5.3中的zend guard laoder以及php5.2中的Zend Optimizer均不能再用,一直很喜欢用的eaccelerator也悲剧了,编译的时候直接提示错误。 php
没办法,翻看php5.5.4的安装目录,发现php的安装目录下的扩展库目录有个opcached.so;咦,这个文件是搞毛线的?看名字带cached,难道是个缓存系统?google了下,果不其然,这个是php5.5默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就能够编译opcache了,只是要启用的话必须配置。 html
1、PHP中opcache的安装、加速效果与配置介绍 linux
通过测试,php5.4、php5.3乃至php5.2也是可使用opcache模块的,参考网络上的测试文章(http://www.cnblogs.com/xiaocen/p/3709850.html)发现:zend opcache(通常就直接简称为opcache了)的加速效率高于xcache,天然也就高于一年多不维护的eaccelerator了。另外,个人测试发如今php5.4上加载了eaccelerator加速扩展后,PHP代码中使用复杂调用preg_replace_callback函数的代码段后会引发严重的内存溢出(memory leak);而preg_replace函数在php5.5已经再也不建议使用,而是改用preg_replace_callback代替,从这个层面来讲,弃用eaccelerator是一个明智的选择。 nginx
低于PHP5.5版本的php要安装opcache也很简单,下载zend opcache(http://pecl.php.net/package/ZendOpcache),好比下载zendopcache-7.0.3.tgz,那么编译安装就很简单了,代码以下: apache
1. tar zxvf zendopcache-7.0.3.tgz 缓存
2. cd zendopcache-7.0.3 服务器
3. phpize 网络
4. #若环境变量未加入phpize的路径 函数
5. #则执行phpize命令时须要加上路径 加环境变量具体请参考 http://blog.jjonline.cn/linux/165.html php-fpm
6. #如你的php安装在 /usr/local/php下,那么此处应该输入
7. #/usr/local/php/bin/phpize
8. ./configure
9. #同理,php安装目录下的bin目录以及sbin目录没有加入环境变量的话就须要加上参数
10. #--with-php-config=/usr/local/php/bin/php-config #路径依据具体路径
11. make && make install
12. #make install 后会提示编译出的opcache.so文件的位置,在php.ini加上相关配置段便可
参考网络上的关于opcache的介绍:新一代PHP加速器,由Zend公司研发,其实现原理与Xcache相似,都是把PHP执行后的数据缓冲到内存中从而避免重复的编译过程,可以直接使用缓冲区已编译的代码从而提升速度,下降服务器负载,但性能却比Xcache更加优越,详见下方测试结果图。其机理简单点说就是将php脚本在虚拟机(暂且称php最终的机器码执行引擎为虚拟机吧)中的机器码或相应的服务器可以直接运行的代码给缓存起来,等到用户下次请求该脚本时就略过了php脚本代码转换为机器码的过程,从而达到加速php运行、起到缓存的效果。
如何配置启用opcache呢?
1. zend_extension = “__Dir__opcached.so”
2. opcache.force_restart_timeout=3600
3. opcache.memory_consumption=1024
4. opcache.optimization_level=1
5. opcache.interned_strings_buffer=8
6. opcache.max_accelerated_files=4096
7. opcache.revalidate_freq=60 ;检测php文件变更频率 单位秒 多少秒检测下php文件是否变更
8. opcache.fast_shutdown=1
9. opcache.enable=1
10. opcache.enable_cli=1
11. #配置中的__Dir__请更换成opcached.so文件的存放位置
opcache的缓存代码块是可使用内存的,具体依据配置参数而定;再也不多介绍。
opcached.so被加载后,全部脚本执行时经过phpinfo就能够看到高速缓存的命中率,以下图中的Cache hits是12,而Cache misses为1
那么这个高速缓存如何被清理呢?依然经过配置文件配置,具体项目就是opcache.force_restart_timeout,经过指定该时间,在多少时间内容该缓存失效。
看到本文过来的关键词,有人在问如何关闭opcache,其实很简单,配置文件中将相关引入opcahe扩展的配置项注释掉便可(php配置文件中的注释可使用英文分号,即在相关opcache的配置项行首位置加入英文分号,而后保存,重启apache或php-fpm便可)。
2、启用opcache后的一些状况
典型的就是因为opcache的缓存加速机制致使的代码变动后没法当即看到效果。php代码被转换成可当即执行的“机器码”后会有必定的缓存时间后才会去检查原始的PHP文件是否变更过,具体视配置项opcache.revalidate_freq设置的秒数状况而定;这样就会致使某些状况下明明更新了PHP文件中的代码,但执行后却看不到改变后的效果,这就是由于opcache检查php文件变更的间隔时间还没有结束所致使。
这个问题并非bug,而要视具体生产环境来设定opcache.revalidate_freq值,假若php代码不多变更,建议该值设置的大一些,可减小opcahce因为检查php文件变更而带来的额外开销,好比7200
那么在变更php文件后如何才能快速下降opcache缓存带来的这种问题呢?最简单的方法就是更新代码后重启下php-fpm(nginx fast-cgi模式)或apache(apache-handler模式)。