PHP缓存文件需用serialize()或json_encode()序列化数据后写入,配合is_dir()/mkdir()建路径、'c'模式或LOCK_EX防并发,并校验文件存在性、时效性及反序列化结果。

用 fopen 和 fwrite 写入缓存文件最直接
PHP 没有内置“缓存文件”函数,得靠自己组合基础 I/O 函数。核心就是把数据序列化后写进文件,后续读取时反序列化。关键不是“能不能写”,而是“怎么写才安全、可读、不踩坑”。
常见错误是直接 fwrite($fp, $data) 而不处理数据格式,导致读取时无法还原(比如数组变字符串、对象丢失方法)。必须明确:缓存内容本质是“可还原的原始值”,不是纯文本展示。
- 优先用
serialize()+unserialize(),兼容性最好,支持所有 PHP 变量类型(含对象) - 若只缓存简单数组/标量,可用
json_encode()+json_decode(),人眼可读、跨语言友好,但不支持资源、闭包、部分对象 - 写入前务必用
is_dir()检查目录是否存在,用mkdir(..., 0755, true)创建多级路径,否则fopen直接失败 - 打开文件要用
'c'模式(截断写入)或先unlink()再写,避免旧数据残留
file_put_contents 是更简洁的替代方案
它底层封装了 fopen/fwrite/fclose,一行代码搞定写入,适合中小体积缓存(如配置、API 响应结果)。
但要注意:默认不校验目录权限,也不自动创建父目录。如果 /cache/v1/ 不存在,file_put_contents('/cache/v1/data.bin', ...) 会静默失败(返回 false),不会报错。
立即学习“PHP免费学习笔记(深入)”;
多奥淘宝客程序免费版拥有淘宝客站点的基本功能,手动更新少,管理简单等优点,适合刚接触网站的淘客们,或者是兼职做淘客们。同样拥有VIP版的模板引擎技 术、强大的文件缓存机制,但没有VIP版的伪原创跟自定义URL等多项创新的搜索引擎优化技术,除此之外也是一款高效的API数据系统实现无人值守全自动 化运行的淘宝客网站程序。4月3日淘宝联盟重新开放淘宝API申请,新用户也可使用了
- 必须配合
dirname()+is_dir()+mkdir()手动建路径 - 加上
LOCK_EX标志(第三个参数)防止并发写入冲突:file_put_contents($path, $content, LOCK_EX) - 不要省略返回值判断:
if (false === file_put_contents(...)) { /* 处理失败 */ } - 避免用
FILE_APPEND做缓存——缓存是“全量替换”,不是日志追加
读取缓存时必须检查文件存在性、时效性和完整性
缓存失效不是靠“文件有没有”,而是靠“文件是否过期”和“内容是否能解析”。很多脚本只做 file_exists() 就直接 include 或 unserialize(),结果遇到损坏文件或过期数据就崩溃。
- 用
filemtime()对比当前时间判断是否超时,例如:if (time() - filemtime($path) > 3600) { /* 过期 */ } - 读取后先
is_file()+filesize() > 0,再file_get_contents(),避免空文件反序列化出错 -
unserialize()可能触发异常(如数据被篡改、PHP 版本不一致),需用@抑制警告,并检查返回值是否为false - JSON 缓存建议用
json_last_error() === JSON_ERROR_NONE确认解析成功
缓存文件名要避开特殊字符,路径别硬编码
用户输入、URL、数组键名直接拼进文件名极易引发问题:斜杠变成路径分隔符、冒号在 Windows 下非法、中文导致 mbstring 编码混乱。缓存路径也别写死成 /var/www/cache,得适配不同部署环境。
- 文件名用
md5($key)或spl_object_hash()(对象场景)生成哈希,彻底规避非法字符 - 路径用
__DIR__ . '/cache/'或从配置读取,别依赖$_SERVER['DOCUMENT_ROOT'] - 扩展名建议统一用
.cache或.bin,不用.php(防止被 Web 服务器直接执行) - 注意 umask 影响:
mkdir()默认权限可能被系统 umask 截断,显式传0755更可靠
缓存文件看着简单,真正难的是“写入不失败、读取不崩、过期不误判、并发不脏写”。每一步的防御性检查都不是多余,而是线上不出问题的底线。










