您好,欢迎访问一九零五行业门户网

现代 PHP 新特性系列(六) -- Zend Opcache

1、概述 字节码 缓存 不是 php 的新特性,有很多独立的扩展可以实现,比如apc、eaccelerator和xache等,但是截至目前这些扩展都没有集成到php内核,从php 5.5.0开始,php内置了字节码缓存功能,名为zend opcache 。
开始之前,我们先来看看什么是字节码缓存,以及字节码缓存的作用是什么。
众所周知,php是解释型语言,构建在zend 虚拟机之上,php解释器在执行php脚本时会解析php脚本代码,把php代码编译成一系列zend操作码(opcode: http://php.net/manual/zh/internals2.opcodes.php ,由于每个操作码都是一个字节长,所以又叫字节码,字节码可以直接被zend虚拟机执行),然后执行字节码。每次请求php文件都是这样,这会消耗很多资源,如果每次http请求都必须不断解析、编译和执行php脚本,消耗的资源更多。如果php源码不变,相应的字节码也不会变化,显然没有必要每次都重新生成opcode,结合在web应用中无处不在的缓存机制,我们可以把首次生成的opcode缓存起来,这样下次直接从缓存取,岂不是很快?下面是启用opcode缓存之前和之后的流程图:
字节码缓存能存储预先编译好的php字节码,这样,下次请求php脚本时,php解释器不用每次读取、解析和编译php代码,直接从内存中读取预先编译好的字节码,然后立即执行,这样能省很多时间,极大提升应用的性能。
2、启用zend opcache
注:如果使用windows开发环境,或者使用 brew 或 apt-get 等命令安装的php可以略过编译步骤。
默认情况下,zend opcache没有开启,需要我们在编译时使用 --enable-opcache 指定启用zend opcache。
编译好php后还需要在 php.ini 中指定opcache扩展路径:
zend_extension=/path/to/opcache.so
一般而言php编译成功后会显示zend opcache扩展路径,但如果想不起来,可以使用如下命令找到php扩展所在目录:
php-config --extension-dir
注:如果你使用xdebug,需要在 php.ini 中先加载zend opcache,再加载xdebug。
更新 php.ini 后重启php进程并查看是否启用成功:
3、配置zend opcache 启用zend opcache后还需要在 php.ini 中配置zend opcache,下面是一份配置示例作为参考:
opcache.validate_timestamps=1 //生产环境中配置为0opcache.revalidate_freq=0 //检查脚本时间戳是否有更新时间opcache.memory_consumption=64 //opcache的共享内存大小,以m为单位opcache.interned_strings_buffer=16 //用来存储临时字符串的内存大小,以m为单位opcache.max_accelerated_files=4000 //opcache哈希表可以存储的脚本文件数量上限opcache.fast_shutdown=1 //使用快速停止续发事件
注:后续我们还会进一步介绍zend opcache的配置,php官网中列出了zend opcache的全部设置: http://ua2.php.net/manual/zh/opcache.configuration.php 。
4、使用zend opcache zend opcache使用起来很简单,因为启用之后它会自动运行,zend opcache会自动在内存中缓存预先编译好的php字节码,如果缓存了某个文件的字节码,就执行对应的字节码。
如果 php.ini 中配置了 opcache.validate_timestamps 值为0,需要小心,因为zend opcache将不能觉察php脚本的变化,必须手动清空zend opcache缓存的字节码,才能让它发现php文件的变动。这个配置适合在生产环境中设置为0,但在开发环境会带来不便,我们可以在开发环境中这样配置启用自动验证缓存功能:
opcache.validate_timestamps=1opcache.revalidate_freq=0
其它类似信息

推荐信息