一、简介
通过将PHP脚本预编译的字节码(Operate Code)存放在共享内存中,避免每次请求都要加载和解析PHP脚本,解析器可以直接从共享内存读取已缓存的字节码。
二、缓存内容
包括
1、opcode 操作码、字节码
2、interned string 预留字节码(可以理解为php请求生命周期中不需要释放的字符串,包括:变量名、类名、方法名、字符串、注释等)
缓存以 key-value 的形式存储,key 是脚本文件名的真实路径。例:
一个index.php文件中引入了 a.php 和 b.php, b.php又引入了 c.php。当一个请求到达 index.php 时,php会分别编译 index.php、a.php、b.php、c.php,每个 php 文件分别作为一个 key-value 存储到 opcache 中。
注意点:
即使opcache可以缓存多个php脚本到操作码,避免每次请求都发生编译,但这并不意味着它的效率和 .exe 一样高。因为即使消除了编译的开销,每次请求php还是需要从缓存获取文件,检查源文件是否被修改,对多个编译后的文件进行链接(如include、require), 将用到的类或函数从 opcache 拷贝至进程的内存空间,这些都需要开销。如果想要进步节省开销,可以考虑使用 preloading 功能。
三、常用uedbet官网手机版最新:
opcache.enable=1 #启用操作缓存码
opcache.memory_consumption=128 #opcache的共享内存大小,单位:M
opcache.interned_strings_buffer=8 #存储预留字符串的内存大小,单位:M
opcache.max_accelerated_files=10000 #opcache哈希表中可存储的脚本文件数量上限。{223,463,983,1979,3907,7963,16229,32531,65407,130987} 这些质数中选择
opcache.max_wasted_percentage=5 #浪费内存的上限,以百分比计
opcache.validate_timestamps=0 #是否每隔一段时间检测脚本是否更新,一般不开启此参数;使用 opcache_reset() 代替,这样上线时可控,不会对流量峰值造成影响
opcache.revalidate_freq=2 #检查更新脚本的间隔时间,配合validate_timestamps使用
对 opcache.validate_timestamps 和 opcache.revalidate_freq 的说明:
若干秒检查php脚本文件是否有更新,然后更新opcache缓存。其实质每次检测都是一次 stat 系统调用,stat 系统调用会进行磁盘I/O,消耗部分CPU,更加浪费性能。
在生产环境中可能出现的情况:文件A的opcache更新了,但是文件B的还没更新,A include B,由于B的opcache还没更新,导致报错。
解决方案:
1、将 validate_timestamps 设置为 0;这样就不会自动去更新 opcache 中的缓存; 改用手动调用 opcache_invalidate() 的php脚本,重新编译上线的脚本。
2、将 validate_timestamps 设置为 0;平滑重启php-fpm,并执行一个自定义的预知性php脚本,将项目中的所有php脚本进行 opcache_compile_file() 操作,然后才开始接收用户的请求。
3、 composer 安装 cachetool 清除 opcache
四、cachetool 安装
首先查看php版本,然后查找对应版本的 cachetool
curl -sO https://gordalina.github.io/cachetool/downloads/cachetool-3.2.2.phar //下载对应的 cachetool版本
php71 cachetool.phar opcache:reset --fcgi //清除缓存
php71 cachetool.phar opcache:status. //查看状态
php71 cachetool.phar opcache:configuration. //查看uedbet官网手机版最新项
参考资料:
1、php常用扩展:https://zbpblog.com/blog-382.html