今儿在azure里装php5.5.4,发现原先php5.4、php5.3中的zend guard laoder以及php5.2中的Zend Optimizer均不能再用,一直很喜欢用的eaccelerator也悲剧了,编译的时候直接提示错误。

没办法,翻看php5.5.4的安装目录,发现php的安装目录下的扩展库目录有个opcached.so;咦,这个文件是搞毛线的?看名字带cached,难道是个缓存系统?google了下,果不其然,这个是php5.5默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就可以编译opcache了,只是要启用的话必须配置。

一、PHP中opcache的安装、加速效果与配置介绍

经过测试,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是一个明智的选择。

低于PHP5.5版本(5.5及其以上版本只需要在编译php的时候加上 --enable-opcache参数即可完成如下编译过程,最后配置启用即可)的php要安装opcache也很简单,下载zend opcache(http://pecl.php.net/package/ZendOpcache),比如下载zendopcache-7.0.3.tgz,那么编译安装就很简单了,代码如下:

  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
  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 = "opcache.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
  8. opcache.fast_shutdown=1
  9. opcache.enable=1
  10. opcache.enable_cli=1
  11. #配置中的__Dir__请更换成opcached.so文件的存放位置 一般在php文件目录的下的lib/extension下的目录中寻找

opcache的缓存代码块是可以使用内存的,具体依据配置参数而定;不再多介绍。

opcached.so被加载后,所有脚本执行时通过phpinfo就可以看到高速缓存的命中率,如下图中的Cache hits是12,而Cache misses为1

那么这个高速缓存如何被清理呢?依然通过配置文件配置,具体项目就是opcache.force_restart_timeout,通过指定该时间,在多少时间内容该缓存失效。

看到本文过来的关键词,有人在问如何关闭opcache,其实很简单,配置文件中将相关引入opcahe扩展的配置项注释掉即可(php配置文件中的注释可以使用英文分号,即在相关opcache的配置项行首位置加入英文分号,然后保存,重启apache或php-fpm即可)。

二、启用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模式)。当然还可以自己书写一个php脚本,调用opcache_reset()函数重置所有opcache缓存字节码,或者使用opcache_invalidate(PHPfileDir,true)重置指定php文件的缓存字节码。

php中的脚本加速扩展opcache的更多相关文章

  1. PHP 缓存扩展opcache

    opcache (全程 zend opcache): 从php5.5开始,默认提供的php脚本缓存扩展,编译php5.5时加上参数--enable-opcache就可以编译opcache了,只是要启用 ...

  2. PHP优化加速之Opcache使用总结

    PHP优化加速之Opcache使用总结: Opcache是一种通过将解析的PHP脚本预编译的字节码存放在共享内存中来避免每次加载和解析PHP脚本的开销,解析器可以直接从共享内存读取已经缓存的字节码,从 ...

  3. 转 [PHP] - 性能加速 - 开启Opcache

    原文地址:[PHP] - 性能加速 - 开启Opcache PHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升  一.开启Opc ...

  4. WDCP,LNMP安装PHP缓存加速扩展eAccelerator,xcache和memcached

    VPS主机性能配置如果太差,则在运行Wordpress博客和Discuz! 论坛等高消耗程序时能够明显感觉出VPS有些吃力.另外,即使VPS主机的CPU.内存.硬盘I/O等性能足够好,但是在面对大流量 ...

  5. PHP扩展--opcache安装及配置

    简介 Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具.现在,Zend 科技公司将 Optimizer+ 在 PHP L ...

  6. VSCode调试Html中的脚本 vscode前端常用插件推荐,搭建JQuery、Vue等开发环境 vsCode 添加浏览器调试和js调试的方法总结 VS Code - Debugger for Chrome调试js

    一.背景 使用Visual Studio Code写了一个简单的Html页面,想调试下其中script标签里的javascript代码,网上查了一通,基本都是复制粘贴或者大同小异的文章,就是要安装De ...

  7. pytorch中调用C进行扩展

    pytorch中调用C进行扩展,使得某些功能在CPU上运行更快: 第一步:编写头文件 /* src/my_lib.h */ int my_lib_add_forward(THFloatTensor * ...

  8. 学习了解PHP中的SeasLog日志扩展

    今天来学习的扩展是和日志相关的一个扩展,对于 PHP 的日志应用来说,除了本身自带的 error_log() . syslog() 之外,在大多数的框架中还会经常见到 monolog 的踪影.当然,我 ...

  9. SecureCRT中python脚本编写

    SecureCRT中python脚本编写学习指南 SecureCRT python 引言 在测试网络设备中,通常使用脚本对设备端进行配置和测试以及维护:对于PE设备的测试维护人员来说使用较多是Secu ...

随机推荐

  1. vue 子组件调用父组件的函数

    子组件调用父组件的函数,使用$emit(eventName,[...args]),触发当前实例上的事件.附加参数都会传给监听器回调. 子组件 <template> <div> ...

  2. java——ArrayList 的存在有什么意义?

    好像所有的数据类型都可以用比如 TreeMap[]  int[] Object[] 这种形式来创建自己的数组,那么ArrayList存在的意义是什么呢? 我只能想到这种:ArrayList可以存储多种 ...

  3. Unity string 转换为 Quaternion

    public Quaternion QuaternionParse(string name) { name = name.Replace("(", "").Re ...

  4. opencv 3.4.0 的编译

    cmake ../ -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local

  5. [转]js 判断js函数、变量是否存在

    本文转自:http://blog.csdn.net/liang4571231/article/details/4042519 在进行js编程时,总会出现可能一些函数或者变量未定义而被引用,导致报错的情 ...

  6. P2P原理和NAT打洞

    1. P2P协议--点对点通信 1.1 常用的P2P协议 1.1.1 电驴(eMule) 一个电驴网络由服务器端和客户端两部分组成. 服务器端是客户端连接的.为了搜索和查找可以下载用户的桥梁.客户通过 ...

  7. 百度网页分享js代码

    1.小图标 <div class="bdsharebuttonbox"> <a href="#" class="bds_qzone& ...

  8. Spring Boot集成Reactor事件处理框架的简单示例

    1. Reactor简介 Reactor 是 Spring 社区发布的基于事件驱动的异步框架,不仅解耦了程序之间的强调用关系,而且有效提升了系统的多线程并发处理能力. 2. Spring Boot集成 ...

  9. (转)Java实现Web Service过程中处理SOAP Header的问题

    网上有篇文章,大致这么说的(如下文),最后我采用的wsimport  -XadditionalHeaders的方式. StrikeIron offers two authentication meth ...

  10. JDBC之Java连接mysql实现增删改查

    使用软件:mysql.eclipse 链接步骤: 1.注册驱动 2.创建一个连接对象 3.写sql语句 4.执行sql语句并返回一个结果或者结果集 5.关闭链接(一般就是connection.stat ...