如何卸载PHP的缓存组件_清理OPcache等缓存模块【方法】

1次阅读

调用 opcache_reset() 可清当前进程 opcache,但需启用且有权限;php-fpm 下仅清单个 worker,cli 默认不生效;apcu 用 apcu_clear_cache() 清用户缓存,同样具进程局部性;重启前需手动清理 opcache.file_cache 等外部缓存。

如何卸载PHP的缓存组件_清理OPcache等缓存模块【方法】

PHP 里怎么清空 OPcache 缓存

直接调用 opcache_reset() 就能清空当前进程的 OPcache,但前提是它被启用且当前脚本有执行权限。这个函数不抛错、不返回 false,成功就返回 true,失败静默返回 false——很多人以为没反应其实是权限或配置问题。

  • 必须在 Web SAPI(如 apache 或 FPM)下运行,CLI 模式默认不加载 OPcache,opcache_reset() 在 CLI 下始终返回 false
  • PHP-FPM 场景下,opcache_reset() 只清当前 worker 进程的缓存,不是全站生效;要彻底清空,得重启所有 worker 或触发 FPM reload
  • 如果启用了 opcache.enable_cli=1,CLI 下也能用,但生产环境极少这么配
  • 常见错误现象:opcache_reset() 返回 false 却没报错,先检查 opcache.enable 是否为 1,再确认当前 SAPI 类型

如何确认 OPcache 当前状态和命中率

opcache_get_status() 查实时数据,比看 phpinfo() 更快更准。它返回数组,关键字段包括 opcache_enabledmemory_usageopcache_statistics 里的 hits/misses

  • opcache_get_status(false) 只返回汇总信息,轻量;加 true 会拉取全部脚本缓存详情,可能卡住,别在高并发接口里用
  • 命中率低于 80% 值得警惕,但别只盯这一个数——如果 opcache.memory_consumption 长期 >95%,说明缓存池太小或脚本太多,该调大或清理无用文件
  • 注意 opcache.validate_timestamps=0 时,即使改了 PHP 文件也不会自动重载,必须手动 opcache_reset() 或重启服务

APCu 缓存怎么安全清掉

apcu_clear_cache() 是主力函数,但它分两层:不带参数清用户缓存(apcu_store() 存的),加 'user''system' 字符串可指定范围;系统缓存(如 APCu 内部结构)一般不用动。

  • 开发调试时常用 apcu_clear_cache('user'),但线上别裸写进接口——没鉴权会被人刷崩
  • APCu 的 key 是进程级的,PHP-FPM 多 worker 下,每个进程有独立缓存,apcu_clear_cache() 只清当前进程,和 OPcache 一样有“局部性”
  • 如果用 apcu_bc 兼容旧 APC,函数名还是 apc_clear_cache(),但行为一致,别混淆
  • 错误现象:清完还读到旧值?确认是不是多个进程各自缓了一份,或者用了 apcu_add()(仅当 key 不存在才存)导致没覆盖成功

重启服务前先确认哪些缓存不会自动重建

OPcache 和 APCu 都是进程启动时初始化,重启 PHP-FPM 或 Apache 后会重新加载,但有些缓存依赖外部状态,比如 redismemcached 里的 PHP 序列化数据,或者自定义的文件缓存目录,它们不会因 PHP 重启而刷新。

立即学习PHP免费学习笔记(深入)”;

  • OPcache 的 opcache.file_cache(磁盘二级缓存)目录内容在重启后仍存在,下次启动会优先加载,但若 PHP 版本升级或 opcache 配置变更,可能引发兼容问题,建议上线前手动清空该路径
  • APCu 没持久化机制,重启即空,但如果你用 apcu_store() 存了大量大对象,重启后首次请求会明显变慢——这是冷启动代价,得接受
  • 最容易被忽略的是 composer 的 autoloader 优化文件(vendor/autoload_*.php),它和 OPcache 无关,但修改类后不删它,composer dump-autoload --optimize 生成的新文件不会自动生效
text=ZqhQzanResources