简述
目前为php提供opcode缓存的扩展有很多,比如:Zend Opcache,xcache,eAccelerator,apc等等。
为什么选择opcache呢?
-
官方出品,这就保证了会持久更新,而其他一些扩展如apc已经很久都没有更新过了;
-
适配php5.2、5.3、5.4,而且在php5.5版本之后自带了opcache,不需要额外安装,在非 Windows 平台使用
zend_extension=/full/path/to/opcache.so, Windows平台使用zend_extension=C:path ophp_opcache.dll即可; -
在各种opcode缓存扩展中,Zend Opcache的优化性能最好
在windows下的安装及配置
将如下配置段加入到php.ini文件中:
zend_extension = "H:/wamp/bin/php/php5.5.12/zend_ext/php_opcache.dll" #以下配置为php文档中推荐的配置 opcache.enable=1 #是否开启opcode缓存 opcache.memory_consumption=128 #OPcache 的共享内存大小,以兆字节为单位 opcache.interned_strings_buffer=8 #用来存储临时字符串的内存大小,以兆字节为单位。 PHP 5.3.0 之前的版本会忽略此配置指令 opcache.max_accelerated_files=4000 #OPcache 哈希表中可存储的脚本文件数量上限。 opcache.revalidate_freq=60 #检查脚本时间戳是否有更新的周期,以秒为单位。 设置为 0 会导致针对每个请求, OPcache 都会检查脚本更新,这个配置在下文中会提到 opcache.fast_shutdown=1 #如果启用,则会使用快速停止续发事件。 所谓快速停止续发事件是指依赖 Zend 引擎的内存管理模块 一次释放全部请求变量的内存,而不是依次释放每一个已分配的内存块。 opcache.enable_cli=1 #OPcache 的共享内存大小,以兆字节为单位
修改完ini文件后重启服务器,打印phpinfo()信息,如果看到如下截图,就说明opcache安装成功了。
上图中的Cache hits(缓存命中率)对我们来说比较具有参考价值。
测试以及相关函数的使用
测试
安装好opcache之后,我们可以先测试一下,
test2.php
$a = hello test; echo $a;
打印结果是hello test。现在修改一下文件内容:
test2.php
$a = hello test2; echo $a;
打印结果依旧是hello test。说明该文件已经经过了opcache缓存。一直刷新该页面,注意观察该值什么时候发生了变化。同时注意phpinfo中缓存命中率的数据是否一直在增加。再检查一下opcache.revalidate_freq的配置参数,就可以看出在opcache.revalidate_freq配置时间段内php不会检查该文件是否有更新。
相关函数
如果想清空opcode缓存,可以使用opcache_reset函数,下面是一个例子:
opcache_reset();
执行代码后可以看到phpinfo中缓存命中率的数据已经清零。
从前面的测试中,我们可以看出,要生成opcode缓存的话,必须有用户访问该页面才行,opcache为我们提供了一种不需要用户访问就能预先生成opcode缓存的方法opcache_compile_file,下面是一个例子:
test4.php
opcache_compile_file(test2.php);
现在我们如果检查test2.php文件是否已经存储到opcode缓存中去了呢?很简单,使用opcache_is_script_cached函数即可,下面是一个例子:
test3.php
var_dump(opcache_is_script_cached(test2.php)); die();
执行结果为:true
前面提到的opcache_reset函数将会清空所有的opcode缓存,如果我们只想清空某个文件的缓存的话可以使用opcache_invalidate函数,下面是一个例子:
test5.php
var_dump(opcache_invalidate(test2.php, true));
再次执行test3.php,运行结果为:false
还有两个函数用于获取opcache的相关信息,opcache_get_status(获取缓存的状态信息),opcache_get_configuration(获取缓存的配置信息),下面是一个例子:
test6.php
var_dump(opcache_get_status()); var_dump(opcache_get_configuration());
执行结果: