php扩展之opcache
By skyshappiness Posted 2020-11-20 20:14:17 In

一、简介

     通过将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 功能。


三、常用配置:

     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.       //查看配置项



参考资料:

1、php常用扩展:https://zbpblog.com/blog-382.html

2、github:cachetool

友情链接
联系方式
  • 邮箱 / E-mail:121388038@qq.com