ThinkPHP 5.1 缓存需显式配置 'serialize' => true 才能正确序列化对象,Redis 驱动自动双重封装,禁止手动序列化;File 驱动建议精简数据或实现 __sleep();自定义驱动可覆盖 serialize() 增强控制。

ThinkPHP 5.1 缓存默认启用 PHP 原生 serialize() 序列化,但该行为受配置项 serialize 显式控制。若需确保对象能正确存取(如调用方法、保留私有属性),必须确认该选项为 true,且避免手动重复序列化。
确认 cache.php 中的 serialize 配置
打开 config/cache.php,检查或补充以下配置:
-
'serialize' => true—— 必须显式设为 true,不可省略或设为1或字符串'true' - 该配置对
file、redis、memcache等主流驱动均生效 - 若设为
false,框架会尝试 JSON 编码(仅限标量和数组),对象将退化为stdClass,丢失方法与访问控制
Redis 驱动下额外注意事项
Redis 缓存驱动在 serialize => true 时,内部会自动执行 serialize() + base64_encode() 双层封装,读取时反向解包。因此:
- 切勿在
Cache::set()前自行serialize($obj),否则导致双重序列化,get()返回的是字符串而非原始对象 - 确保
php.ini中未禁用unserialize_callback_func,否则类定义缺失时静默失败(返回null) - 不同 TP 版本间 Redis 缓存不兼容:TP5.1 写入的数据,TP6.1+ 因加了类型前缀(如
s:)可能无法识别,需清空旧缓存
File 驱动中优化大对象序列化
文件缓存直接写入序列化字符串,无压缩,易因冗余信息(类名、命名空间、长文本)导致体积膨胀和读取变慢:
立即学习“PHP免费学习笔记(深入)”;
- 优先缓存精简结构,例如用
$model->toArray()替代完整 Model 实例 - 在对象中定义
__sleep()方法,显式声明需序列化的属性,跳过临时字段、资源句柄或连接实例 - 避免缓存含
DateTime、Closure、PDO 连接等不可序列化或跨环境不稳定的成员
自定义序列化逻辑(进阶)
若需更精细控制(如过滤资源、统一处理异常),可继承内置驱动并重写 serialize() 方法:
- 新建类
app\common\cache\SerializableFile继承\think\cache\driver\File - 覆盖
serialize()方法,在其中拦截对象、跳过Closure或资源类型 - 在
cache.php中将type改为该自定义类的完整命名空间



















