网站开启Opcache

发布于 2019-10-16  24 次阅读


前言

什么是OPcache呢?

OPcache是 PHP 中的 Zend 扩展,可以大大提升 PHP 的性能。
OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。

总的来说,就是缓存PHP代码加速执行的,能提升PHP7性能。

并不是像FastCGI只缓存页面,它缓存所有的php文件,像是wordpress本体程序,还有插件。

修改php.ini

找到:[opcache],设置为:

[opcache]
;引用opcache
zend_extension = opcache.so

;确定是否启用了Zend OPCache
opcache.enable = 1

;确定是否启用了Zend OPCache CLI
opcache.enable_cli = 1

;OPcache共享内存存储大小。
opcache.memory_consumption = 512

;暂存池中字符串的占内存总量
opcache.interned_strings_buffer = 64

;OPcache哈希表中的最大键数, 控制内存中最多可以缓存多少个PHP文件,命中率不到100%,可以试着提高这个值
opcache.max_accelerated_files = 100000

;配置为1时,会根据revalidate_freq设定的值检查更新代码;设置为0时,永不检查;设置为0时,需要reload php 或调用 opcache_reset 函数清除才能看到最新代码效果
;对于开发/测试,设置1
;对于生产环境,设置0
opcache.validate_timestamps = 0 

;设置缓存的过期时间,默认2,检测php代码是否更改间隔(秒),若值为0表示每次请求都会检查你的PHP代码是否更新(将会增加开销)
opcache.revalidate_freq = 2 

;是否保存文件/函数的注释,建议保持启用,因为有些库依赖它,本来也没有关掉的必要
opcache.save_comments = 1

;打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高,在7.2.0中被移除,会自动开启
opcache.fast_shutdown = 1

查看是否启用OPcache

[root@php ~]# php-fpm -m
[PHP Modules]
....
[Zend Modules]
Zend OPcache

计算php文件数

find . -type f -print | grep php | wc -l

常用函数

opcache_compile_file($php_file); 
#预生成opcode缓存
opcache_is_script_cached($php_file);
#查看是否生成opcode缓存
opcache_invalidate($php_file, true);
#清除单个缓存
opcache_reset();
#清空缓存
opcache_get_status(); 
#获取缓存的状态信息
opcache_get_configuration(); 
#获取缓存的配置信息

OPcache命中状态

wget https://raw.githubusercontent.com/rlerdorf/opcache-status/master/opcache.php
#将其放入网站目录里访问
rm opcache.php
#使用完记得删除,或是在nginx中限制访问

opcache-status

OPcache清除配置

cd 网站根目录

echo "<?php opcache_reset(); ?>" > opcache-reset.php 
#将清空缓存函数输入到opcache-reset.php 文件中

curl  http://网站ip/opcache-reset.php
#使用w3m也可以
#清除所有opcache

rm opcache-reset.php 
#使用完记得删除,或是在nginx中限制访问

OPcache缓存黑名单

在opcache.php->Configuration-> blacklist_filename 可以获得缓存黑名单的文本文件

在文件中填入黑名单路径即可,一行一个,可以使用通配符。

简单的黑名单文件可能如下所示:

;这是注释
; 将特定文件加入到黑名单
/var/www/broken.php
; 以字符 x 文件打头的文件
/var/www/x
; 通配符匹配
/var/www/*-broken.php
/var/www/*

可能出现问题

PhP warning - Cannot load Zend OPcache - it was already loaded

你重复加载了opcache.so文件,也许是你在php.ini中有多条zend_extension = opcache.so,又或者你曾执行过yum install php-opcache,总之将多余删掉,最后只剩一个就可以了。

具体报错信息:

[root@php etc]# php -v
Cannot load Zend OPcache - it was already loaded
PHP 7.3.10 (cli) (built: Sep 24 2019 09:20:18) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.10, Copyright (c) 1999-2018, by Zend Technologies
PHP Warning: Failed loading Zend extension 'opcache.so'

不能找到opcache.so文件,这说明你的/usr/lib64/php/modules/目录下没有opcache.so。你可以下一个opcache.so文件移动到这个目录里。

或者直接安装一个opcache

yum install php-opcache
#我曾换过源,所以使用下面这条
yum enablerepo=remi-php73 install php-opcahe

具体报错信息:

[root@php etc]# php -v
PHP Warning:  Failed loading Zend extension 'opcache.so' (tried: /usr/lib64/php/modules/opcache.so (/usr/lib64/php/modules/opcache.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/opcache.so.so (/usr/lib64/php/modules/opcache.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
PHP 7.3.8 (cli) (built: Jul 30 2019 09:26:16) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies

枫和:“咱们网站真的有必要搞这么多缓存吗?又没人访问。”