APCu缓存导出需调用apcu_dump_apu()函数获取键值对,再经serialize()或json_encode()序列化后写入文件,不可用apcu_cache_info();其他缓存如OPcache、Redis等导出方式各异,须先确认类型。

PHP缓存导出前先确认缓存类型
PHP本身不自带持久化缓存机制,所谓“PHP缓存”通常是外部组件实现的:比如 OPcache(字节码缓存)、APCu(用户数据缓存)、Redis 或 Memcached(独立服务)。导出方式完全不同,不能一概而论。
先运行 phpinfo() 或检查 extension_loaded('apcu')、extension_loaded('opcache'),再看是否连接了 redis-cli 或 memcached 服务。否则你可能根本没在用缓存,或用的是框架层缓存(如 Laravel 的 Cache::store('file')),那备份的就是文件目录而非内存数据。
APCu 缓存导出要靠 apcu_dump_apu() + 序列化
APCu 是 PHP 扩展级用户缓存,数据存在共享内存里,无法直接 dump 成文件。官方没提供导出命令,但可通过函数手动提取:
-
apcu_cache_info('user')只返回统计信息,不含值 - 真正能导出键值对的是
apcu_dump_apu()(注意函数名拼写,不是dump_all) - 该函数返回一个
array,需用serialize()或json_encode()转成字符串再写入文件
示例片段:
立即学习“PHP免费学习笔记(深入)”;
if (function_exists('apcu_dump_apu')) {
$data = apcu_dump_apu();
file_put_contents('/tmp/apcu-backup-' . date('Ymd-His') . '.php', '
⚠️ 注意:apcu_dump_apu() 在 APCu 5.1.17+ 才稳定支持,旧版本会报 Call to undefined function;且它不导出过期键(即使还没被清理),也不包含 TTL 信息。
Redis / Memcached 缓存导出用原生命令更可靠
如果 PHP 缓存后端是 Redis 或 Memcached,别用 PHP 脚本遍历——容易漏键、超时、阻塞主线程。直接走服务端命令:
-
Redis:用redis-cli --scan --pattern '*' | xargs -L 100 redis-cli MGET配合脚本组装,但更稳妥的是启用 RDB 持久化后拷贝dump.rdb文件(路径查redis.conf中dbfilename和dir) -
Memcached:没有内置导出,只能用echo "stats items" | nc localhost 11211查 slab,再配合第三方工具如memcdump(来自libmemcached工具集)
关键点:PHP 连接这些服务只是客户端,缓存数据不在 PHP 进程里,所以任何基于 apcu_* 或 memcache_get() 的循环读取都属于低效且易错的“模拟导出”。
OPcache 缓存不能导出,只能重启后重建
OPcache 是 PHP 解析器的字节码缓存,只存在于进程内存中,且内容是编译后的 opcode,不具备可序列化结构。官方明确不支持导出或迁移 —— 你看到的 opcache_get_status() 返回的只是统计和文件列表,没有实际字节码数据。
备份 OPcache 的唯一可行做法是:
- 记录当前启用的配置项(如
opcache.enable、opcache.memory_consumption) - 确保代码文件已通过 Git 或其他方式备份
- 重启 PHP-FPM 或 Apache 后,OPcache 会自动重新编译加载
试图用 opcache_invalidate() 或 opcache_reset() 配合文件写入,只会清空缓存,不会生成备份文件。
真正麻烦的不是怎么导,而是导什么、从哪导、导出来能不能用。很多团队以为“缓存导出=一键打包”,结果恢复时发现 APCu 数据缺 TTL、Redis RDB 版本不兼容、OPcache 根本没得导——这些细节比语法更重要。











