WP Super Cache 静态网页虽然快,但是最致命的缺点是动态元素没法变更,比如阅读数和文章发布距今时间;而且页面一有修改就要重新生成缓存,开销还是蛮大的。
OPcache 加持后,耗时几乎和静态网页持平,而且保持了页面的动态,内存消耗也极大降低,在后台看页面刷新时 CPU 终于不是 100% 了。而且不仅前台,后台管理页面也加速了。
当然 WP Super Cache 也不是完全没用了,一些几乎就是纯静态的网页(比如隐私政策,友链列表)在长时间内变化很小,就可以弄成静态网页进一步降低性能消耗。
宝塔面板开启 OPCache 扩展
OPcache 参数设置
重启一下 php 服务,然后在"配置文件"搜索 opcache.enable
跳到 opcache 的参数设置。
opcache.memory_consumption
- 单位 MB,默认 128
- opcache 缓存占用的内存。低配置机器一般设置为可用内存的 1/4,或者 256-512 MB。更大的内存占用可以放下更多的缓存。
- 我的机器总共 2G 内存,可用内存 1.5G 左右,所以我很慷慨地分了 512MB。
opcache.interned_strings_buffer
- 单位 MB,默认 32
- 在 PHP 中,字符串常量是不可变的,它们在内存中占据一定的空间。为了提高性能和减少内存消耗,PHP 使用了字符串池(string intern pool)的机制。字符串池通过在内存中共享相同的字符串常量,避免了重复存储相同的字符串数据。增加
opcache.interned_strings_buffer
的大小可以提高字符串常量的共享和重用,从而减少内存占用。 - 这里我就保持给个 64 MB,之后可以根据实际使用情况再做调整。
opcache.max_accelerated_files
- 单位 个,默认 80000
- 最高可以缓存多少个文件。当达到
opcache.max_accelerated_files
设置的限制时,OPcache 会使用一种替换策略(例如最早使用的文件将被淘汰)来释放缓存中的一些脚本文件,为新的脚本文件腾出空间。 - 设置过小可能会导致频繁的文件淘汰,增加了解析和编译的开销,降低了 OPcache 的性能优势。而设置过大可能会占用过多的内存资源,特别是在有限的服务器配置下。
- 如果站点不大,完全可以保持默认或者直接容纳所有文件。查看站点下有多少 php 文件的命令行:
cd <你的站点目录> sudo find . -iname "*.php" | wc -l
- 我的站点目前有近 3000 个 php 文件,我这里就保留默认
opcache.max_accelerated_files=80000
。
opcache.revalidate_freq
- 单位 秒,默认 3
- 当
opcache.validate_timestamps
参数启用时,OPcache 会在每个请求中检查脚本文件的时间戳以确定是否重新缓存。opcache.revalidate_freq
参数定义了多少秒后进行一次时间戳检查。 - 一般个人博客站点不会非常频繁地修改 php 代码(除非很喜欢自己加乱七八糟地功能),而检查时间戳的操作会增加性能开销,所以这个值可以调大,甚至设置为 0 禁用检查;而如果你正在频繁地修改 php 代码,那么可能就要调小一点,比如个位数。
- 我这里就暂时先设置为 60。
opcache.fast_shutdow
- 没搞懂干嘛的,保持默认 1。
opcache.validate_timestamps
- 布尔值 0 和 1,默认 1
- 当
opcache.validate_timestamps
设置为 1,OPcache 在每个请求中会检查脚本文件的时间戳以确定是否重新缓存。 - 如果禁用(设置为 0 ),就永远不会检查缓存是否过期,修改了 php 文件后需要手动执行检查。
- 宝塔配置文件没有,我添加了上去并且保持默认的 1。
- 修改完之后,保存并重启 php 服务。
- 监视 OPcache 工作情况
- 这里就选用 WPJAM BASIC 这个插件监视。
刚刚开始使用了不到半个小时的截图
第一个饼图对应 opcache.memory_consumption
,最后一个饼图对应 opcache.interned_strings_buffer
,可以根据这里的使用情况在日后调整这两个参数。
参考说明:
zend_extension=opcache.so ;opcache可用内存 Mb opcache.memory_consumption=128 opcache.enable=1 opcache.enable_cli=1 ;Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB) opcache.interned_strings_buffer=8 ;对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值 最大缓存文件 opcache.max_accelerated_files=4000 ;内存“浪费”达到此值对应的百分比,就会发起一个重启调度. opcache.max_wasted_percentage=5 ; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒,经测试,设置范围在2-5之间效果较好 opcache.revalidate_freq=60 ; 打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高 opcache.fast_shutdown=1 ; 开启这条指令, Zend Optimizer + 会自动将当前工作目录的名字追加到脚本键上, ; 以此消除同名文件间的键值命名冲突.关闭这条指令会提升性能, ; 但是会对已存在的应用造成破坏. opcache.use_cwd=0 ; 开启文件时间戳验证 关闭后不再自动刷新文件 opcache.validate_timestamps=1 ; 允许或禁止在 include_path 中进行文件搜索的优化 ;opcache.revalidate_path=0