什么是Opcache?
每一次执行 PHP 脚本的时候,该脚本都需要被编译成字节码,而 Opcache 可以对该字节码进行缓存,这样,下次请求同一个脚本的时候,该脚本就不需要重新编译,这极大节省了脚本的执行时间,从而让应用运行速度更快,同时也节省了服务器的开销。
Opcache 的执行流程大致如下:
PHP解释器从文件系统读取文件、扫描其词典和表达式、解析文件、创建要执行的计算机代码(称为Opcode),最后执行Opcode。每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,则Opcode也不会发生变化。因此,如果将Opcode缓存下来,以后直接访问缓存的Opcode,可以加快PHP的执行效率。
PHP7之前的Opcache只支持共享内存缓存,不支持文件缓存。PHP7新增了文件缓存功能,在储存共享内存缓存的同时,可将每个PHP源文件生成的Opcode导出为相应的PHP文件对应的Opcode文件,后缀为.bin。
默认情况下内存缓存的优先级高于文件缓存,当发起PHP脚本请求时,PHP解释器首先检查内存缓存中是否存在当前所请求的PHP脚本对应的Opcode,若有,则直接执行。若没有,则到指定目录中寻找当前所请求的PHP脚本对应的Opcode文件,若存在相应的Opcode文件,则将该文件导入内存中,执行。否则,说明内存缓存和文件缓存中均不存在相应PHP脚本的Opcode,需要重新解析文件。
听起来很牛逼,不过怎么使用呢?
一、找到opcache文件
二、配置opcache
;opcachezend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so
opcache.enable=1
;OPcache 的共享内存大小,以兆字节为单位。opcache.memory_consumption=128
;用来存储预留字符串的内存大小,以兆字节为单位。 opcache.interned_strings_buffer=8
;哈希表中可存储的脚本文件数量上限。设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。opcache.max_accelerated_files=10000
;opcache不保存注释opcache.save_comments=0;关闭PHP文件时间戳验证opcache.validate_timestamps=0;每60秒验证php文件时间戳是否更新;opcache.revalidate_freq=60
;打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高opcache.fast_shutdown=1
;注意,PHP7下命令行执行的脚本也会被 opcache.file_cache 缓存.opcache.enable_cli=;设置不缓存的黑名单;opcache.blacklist_filename=/www/server/opcache_blacklist
;设置字节码保存路径opcache.file_cache=/www/server/opcache_file_cache
;启用或禁用在共享内存中的 opcode 缓存。
opcache.file_cache_only=0
三、生成文件缓存
可通过运行脚本或者opcache_compile_file () 函数将php编译后的机器码保存在opcache.file_cache目录下,就可以加速脚本了。
如在项目根目录文件加上 opcache.php<?phpfunction getfiles($path, &$files = array()){
if (!is_dir($path)) return null;
$handle = opendir($path);
while (false !== ($file = readdir($handle))) {
if ($file != '.' && $file != '..') {
$path2 = $path . '/' . $file;
if (is_dir($path2)) {
getfiles($path2, $files);
} else {
if (preg_match('%\.php$%', $file)) {
$files[] = $path2;
}
}
}
}
return $files;}// 获取指定目录及其子目录下的所有PHP文件$files = getfiles('/home/wwwroot/website');foreach ($files as $file) {
//编译PHP文件生成opcode
opcache_compile_file($file);
//清空原来的PHP脚本
file_put_contents($file, '');}
发布代码后请求文件使缓存生效
如需保护php源码则可在缓存机器码后将网站目录PHP脚本内容变更为任意内容(不可删除文件),运行的也是保存在opcache_cache目录下的机器码了。
生成的缓存机器码如下图:
打开文件内容如下:
四、简单测试
未开启 opcache 情况
开启 opcache 情况
从上面的截图中就可以看出,未开启 opcache 的情况下,基本稳定在 70-90 左右,但是开启 opcache 后,请求基本都稳定在 50ms 左右,所以可以看出提升性能还是很明显的。
这样,既保护了你的源码,又加速了你的应用,赶紧去试一下吧!