PHP文件缓存适合低频读写、单机部署场景,可用file_put_contents+serialize或json_encode实现,但需注意反序列化风险、权限、并发写入及过期清理问题。

PHP 文件缓存不是“不能用”,而是容易踩坑——比如并发写入导致数据损坏、序列化格式不一致、权限错误直接失败。它只适合低频读写、单机部署、无严格一致性要求的场景,比如存个配置快照或临时统计。
用 file_put_contents() + serialize() 最简存取
这是最轻量的组合,不依赖扩展,三行代码搞定存和取:
file_put_contents('/tmp/cache.dat', serialize($data));
$data = unserialize(file_get_contents('/tmp/cache.dat'));
但要注意:
-
unserialize()有反序列化风险,绝不能用于不可信数据(比如用户传来的缓存键) - 文件路径必须有写权限,且 PHP 进程能访问(
/tmp通常安全,./cache/要手动chmod) - 没加锁,高并发时可能写乱——两个请求同时写,后写完的覆盖前写的
加文件锁避免并发写坏数据
用 fopen() 配合 LOCK_EX 是简单可靠的方案:
立即学习“PHP免费学习笔记(深入)”;
SHOPEX简灰服装商城整站源码下载。 安装方法:1.解压上传程序至网站根目录.. 访问:域名/bak.(用户名:admin 密码:123456)2.进入帝国备份王后,配置数据库数据库信息.选择-www.taomoban.net目录.还原数据库.3.修改FTP目录下的config/config.phpphp 数据库连接信息.4.登陆网站后台--清空缓存..5.删除bak文件夹 后台:shopadm
$fp = fopen('/tmp/cache.dat', 'c');
if (flock($fp, LOCK_EX)) {
fwrite($fp, serialize($data));
fflush($fp);
flock($fp, LOCK_UN);
}
fclose($fp);
关键点:
-
'c'模式打开,确保文件存在且不截断;用file_put_contents(..., LOCK_EX)也行,但它只锁写过程,不锁读 - 必须调用
fflush()强制刷盘,否则锁释放后内容可能还在缓冲区 - 读的时候不用锁,但若要“读-改-写”,就得全程加锁
用 json_encode() 替代 serialize() 更安全可读
如果数据只是数组/标量,json_encode() 和 json_decode() 是更稳妥的选择:
file_put_contents('/tmp/cache.json', json_encode($data, JSON_UNESCAPED_UNICODE));
$data = json_decode(file_get_contents('/tmp/cache.json'), true);
优势明显:
- 无反序列化漏洞,跨语言也兼容
- 人眼可读,调试时直接
cat /tmp/cache.json就能看 - 但注意:PHP 的
DateTime、资源、闭包等无法 JSON 化,会丢成null
文件缓存真正的难点不在“怎么写”,而在“什么时候删”和“谁来清理”。没人定期清理,/tmp 下一堆过期缓存,磁盘迟早满;自己加时间戳判断又容易误删——这些逻辑一旦混进业务代码,就很难维护了。










