总字符数: 4.70K

代码: 1.07K, 文本: 2.02K

预计阅读时间: 13 分钟

如果想要网站响应速度快,肯定少不了进行网站优化,比如开启各种缓存,像Memcached缓存,Opcache缓存等等.这里记录一下Opcache设置教程.

什么是Opcache呢?

Opcache 的前生是 Optimizer+ ,它是PHP的官方公司 Zend 开发的一款闭源但可以免费使用的 PHP 优化加速组件. Optimizer+ 将PHP代码预编译生成的脚本文件 Opcode 缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗.同时,它还应用了一些代码优化模式,使得代码执行更快.从而加速PHP的执行. PHP的正常执行流程如下

request请求(nginx,apache,cli等)–>Zend引擎读取.php文件–>扫描其词典和表达式 –>解析文件–>创建要执行的计算机代码(称为Opcode)–>最后执行Opcode–> response 返回 每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:
Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销.

下面介绍Opcache的安装

1
2
3
4
1、找到opcache的扩展,我的是php7.4
yum list php74*
2、安装扩展
yum install php74-php-opcache.x86_64 -y

PHP配置文件

1
2
[root@centos opt]# find / -name php.ini #查找php.ini文件位置 
/etc/opt/remi/php74/php.ini

编辑配置文件,找到[opcache] 加入

1
opcache.enable=1

此参数的值为 1 代表开启 Opcache,值为 0 代表关闭 Opcache,默认值为 1.

1
opcache.memory_consumption=512

此参数的值代表 Opcache 占用内存的大小,单位是 MB,默认值为 64.建议根据服务器内存情况来设置

1
opcache.interned_strings_buffer=64

此参数的值的单位是 MB,默认值为 8,建议根据服务器内存大小,设置一个大于 64 的值即可. PHP 使用了一种叫做字符串驻留(string interning)的技术来改善性能.例如,如果你在代码中使用了 1000 次字符串 foobar,Zend 引擎在第一次使用这个字符串时会分配一个不可变的内存区域来存储这个字符串,之后的 999 次都会直接引用这个内存区域,而不需要重复创建.

1
opcache.max_accelerated_files=3000

Zend 引擎在第一次执行某 PHP 文件后,会将该文件的 OPcode 存储在哈希表中,之后的请求直接从哈希表中找到相应文件的 OPcode,从而达到性能优化,而此配置选项决定了可以存储的 PHP 文件数量上限. Zend 引擎对此配置参数的真实取值是在质数集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一个大于等于参数值的质数,例如设置此参数的值为 222,则真实取值为 223. 那么如何知道我们应用中的 PHP 文件数量呢?进入应用目录,一般这里指的是进入我们WordPress的站点根目录,使用如下命令即可查看应用中的 PHP 文件数量:

1
2
3
[root@VM-8-7-centos wordpress-1258894728.cos.ap-beijing.myqcloud.com]# cd /root/jiangjiyue/wordpress-1258894728.cos.ap-beijing.myqcloud.com/ 
[root@VM-8-7-centos wordpress-1258894728.cos.ap-beijing.myqcloud.com]# find . -type f -print grep php wc -l
1292

PHP 文件数量为 1292,所以我将该参数的值设置为 3000.

1
opcache.validate_timestamps=0

如果此参数的值设置为 1,那么 Zend 引擎在收到请求时,会每隔一段时间检测一次被请求的 PHP 文件是否已更新.如果文件已更新,就会重新对该文件进行语法分析、编译等步骤,生成新的 Opcode. 检测的周期是根据另一个参数 opcache.revalidate_freq 而定的,每次检测都是一次 stat 系统调用,众所周知,系统调用会消耗一些 CPU 时间,并且 stat 系统调用会进行磁盘 I/O,更加浪费性能. 不仅如此,假设你对服务器中的 PHP 文件进行了一次大量的更新,更新的过程中部分旧的文件会因为未过期而依然生效,和部分已生效的新文件混合在一起产生作用,必然会产生不确定因素,带来很多麻烦,所以建议将此参数的值设置为 0 . 不过需要注意的是,设置为 0 后,无论你怎么更新文件,Zend 引擎都会使用已缓存的 Opcode,除非重启 php-fpm 或使用 opcache_reset() 方法清空缓存,当然下面我也会提供Opcache-gui(通过Web界面管理,可以重置缓存)

1
opcache.save_comments=1

如果禁用,脚本文件中的注释内容将不会被包含到操作码缓存文件, 这样可以有效减小优化后的文件体积. 禁用此配置指令可能会导致一些依赖注释或注解的 应用或框架无法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit.所以这里启用

1
opcache.file_update_protection=0

当 Zend 引擎执行某 PHP 文件时,如果该文件的 Modify 时间戳 距当前时间的差值小于此参数的值,则该文件不会被缓存,此参数值的单位为秒,默认为 2. 此参数的目的是为了防止文件还未修改完成就被 Opcache 缓存了,从而产生错误.而实际生产环境中,我们将 opcache.validate_timestamps 设置为 0,文件只要被访问一次,就会被永久缓存,除非重启 php-fpm 才会刷新缓存,所以此参数没什么用,还浪费性能,建议设置为 0.

1
opcache.huge_code_pages=1

众所周知,Linux 系统默认内存是以 4KB 进行分页的,而虚拟地址和内存地址是需要转换的,转换过程需要进行查表,CPU 为了加速查表会内建 TLB(Translation Lookaside Buffer),而 TLB 的大小是有限的,分页越小,表里的条目也就越多,TLB 的 Cache Miss 也就越高. 所以我们如果启用大内存页,就能间接降低 TLB 的 Cache Miss,而 Opcache 也能使用 Hugepage 来缓存 Opcodes,从而达到性能优化的目的. 此参数值为 1 即可开启以上功能,默认值为 0. 设置完后还没正式开启,需要系统开启 Hugepage 功能,使用如下命令可以查看当前系统 Hugepage 的信息:

1
2
3
4
5
6
[root@centos wordpress-1258894728.cos.ap-beijing.myqcloud.com]# cat /proc/meminfo  grep Huge AnonHugePages: 133120 kB 
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB

可以看到 HugePages_Total 等参数的值为 0,也就是未开启 HugePages 功能.

运行如下命令即可开启 HugePages,其中 128 代表 HugePages 的大小,单位是 MB:

1
sysctl vm.nr_hugepages=128

建议根据服务器内存情况进行分配 HugePages,例如服务器是 2G,设置为 128,可以自行参考进行设置

最终配置

Opcache-gui

这里使用的gui界面是amnuts分享的

1
2
3
4
5
6
# 进入opt目录
cd /opt
# 安装git
yum install -y git
# 克隆项目到本地
wget https://github.com/amnuts/opcache-gui.git

然后将项目中的index.php移到您的 Web 服务器可以加载的位置.然后将浏览器指向该位置,例如https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/Opcache-gui-zn.php一定要重启PHP-FPM服务如图:

我将此文件进行了大概的汉化