理解OpCache

概念

OpCache通过对opcode的缓存和优化来提升php执行速度。在php5.5及以上版本已内置,编译安装时使用—enable-opcache即可。

当解析器完成对脚本代码的分析后,便将他们生成可直接运行的中间代码,也称之为操作码(operate code,opcode).opcode缓存的目的是避免重复编译,减少cpu和内存开销。如果动态内容的性能瓶颈不在于cpu和内存而在于I/O操作,比如数据库查询带来的I/O开销,那么opcode cache的性能提升是非常有限的。

现代操作码缓存器(opcache,apc等)使用共享内存进行存储,并可以直接从中执行文件

开启方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; 开关打开
opcache.enable=1
; cli缓存开关 默认开启
opcache.enable=0
; 最大缓存的文件数目, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=5000
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 单位为秒
opcache.revalidate_freq=240
; 可用内存, 酌情而定, 单位 megabytes
opcache.memory_consumption=256
; interned string 的内存大小, 也可调
opcache.interned_strings_buffer=8
; 是否快速关闭, 打开后在PHP Request Shutdown的时候回收内存的速度会提高
opcache.fast_shutdown=1
; 不保存文件/函数的注释
opcache.save_comments=0

检查安装

1
2
3
4
5
6
php -v
PHP 5.5.3-1ubuntu2.2 (cli) (built: Feb 28 2014 20:06:05)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies

20171130151204709840651.png

清除缓存

通过opcache_reset()函数清除缓存。该函数将重置整个字节码缓存。调用opcache_reset()后,所有脚本将会重新载入并在下次点击时重新解析

注意!通过cli模式和http访问产生的字节码是分开存储的,也就是说在cli下执行opcache_reset只能清除cli模式下的缓存。
如果要在命令行下清除http字节码,可以使用curl

1
2
3
4
5
WEBDIR=/var/www/html/
RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)
echo "<?php opcache_reset(); ?>" > ${WEBDIR}${RANDOM_NAME}.php
curl http://localhost/${RANDOM_NAME}.php
rm ${WEBDIR}${RANDOM_NAME}.php

参考

使用 OpCache 提升 PHP 性能