字节码缓存不是PHP的新特性,有不少独立的扩展能够实现,好比APC、eAccelerator和Xache等,可是截至目前这些扩展都没有集成到PHP内核,从PHP 5.5.0开始,PHP内置了字节码缓存功能,名为Zend Opcache。php
开始以前,咱们先来看看什么是字节码缓存,以及字节码缓存的做用是什么。缓存
众所周知,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代码,直接从内存中读取预先编译好的字节码,而后当即执行,这样能省不少时间,极大提高应用的性能。spa
注:若是使用Windows开发环境,或者使用
brew
或apt-get
等命令安装的PHP能够略过编译步骤。.net
默认状况下,Zend Opcache没有开启,须要咱们在编译时使用--enable-opcache
指定启用Zend Opcache。debug
编译好PHP后还须要在php.ini
中指定Opcache扩展路径:code
zend_extension=/path/to/opcache.so
通常而言PHP编译成功后会显示Zend Opcache扩展路径,但若是想不起来,能够使用以下命令找到PHP扩展所在目录:blog
php-config --extension-dir
注:若是你使用Xdebug,须要在
php.ini
中先加载Zend Opcache,再加载Xdebug。进程
更新php.ini
后重启PHP进程并查看是否启用成功:事件
启用Zend Opcache后还须要在php.ini
中配置Zend Opcache,下面是一份配置示例做为参考:
opcache.validate_timestamps=1 //生产环境中配置为0 opcache.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。
Zend Opcache使用起来很简单,由于启用以后它会自动运行,Zend Opcache会自动在内存中缓存预先编译好的PHP字节码,若是缓存了某个文件的字节码,就执行对应的字节码。
若是php.ini
中配置了opcache.validate_timestamps
值为0,须要当心,由于Zend Opcache将不能觉察PHP脚本的变化,必须手动清空Zend OPcache缓存的字节码,才能让它发现PHP文件的变更。这个配置适合在生产环境中设置为0,但在开发环境会带来不便,咱们能够在开发环境中这样配置启用自动验证缓存功能:
opcache.validate_timestamps=1 opcache.revalidate_freq=0