file_get_contents和file_put_contents适用于小文件、非并发场景,但需防范内存、权限、并发、路径安全四类坑;大文件须用fopen+fgets,路径须校验权限与合法性,中文需统一utf-8编码并手动转码。

file_get_contents 和 file_put_contents 足够应付 90% 的日常需求,但盲目套用会踩内存、权限、并发、路径安全四类坑——不是函数不行,是没搞清它们的边界。
什么时候该用 file_get_contents / file_put_contents
适合配置文件、小日志、JSON 缓存这类「内容不大、操作简单、不并发写」的场景。比如读取 config.json 并解析,或把一条调试信息写进 debug.log。
- 单行就能完成读/写,不用管
fopen/fclose,也不怕忘记关句柄 -
file_put_contents($path, $data, FILE_APPEND | LOCK_EX)可追加+加锁,比手写flock简洁 - 失败时只返回
false,调试得立刻接error_get_last()看具体错误,比如"Permission denied"还是"No such file or directory" - 别用它读几百 MB 的日志:
memory_limit会直接报错,PHP 把整个文件塞进内存,不是流式处理
大文件或逐行处理必须用 fopen + fgets
日志分析、CSV 导入、文本清洗这类任务,不能一次性加载全部内容——fgets 是最常用也最容易出错的环节。
- 用
fgets($fp)时,如果某行超长(比如含 base64 字段),可能阻塞或返回false;改用stream_get_line($fp, 8192, "\n")更可控 - 二进制文件(如图片、ZIP)必须加
b模式:fopen($path, 'rb'),否则 Windows 下换行符会被悄悄转义 - 每次调用
fopen后必须检查返回值:if (!$fp) { /* 处理失败 */ },否则后续fgets会报"expects parameter 1 to be resource, bool given" - 写入时若需并发安全,
flock($fp, LOCK_EX)必须在fwrite前,且flock($fp, LOCK_UN)在fclose前,顺序错就等于没锁
路径和权限检查不能只靠 file_exists
file_exists 只告诉你「路径存在」,但 PHP 进程很可能既读不了也写不了——尤其部署到 Linux 服务器后。
- 用
is_readable($path)和is_writable($path)替代file_exists做前置判断,它们反映真实权限 - 写入前确保目录可写:
$dir = dirname($path); if (!is_dir($dir) && !mkdir($dir, 0755, true)) { /* 创建失败 */ } - 用户输入的路径必须过滤:
basename($user_input)剥离../,再用realpath($path)校验是否落在白名单目录内 - 写完敏感文件(如 API key)建议立刻降权:
chmod($path, 0600),避免被 Web 服务意外暴露
中文乱码本质是编码没对齐
不是 PHP 不支持中文,而是文件存储编码、脚本源码编码、file_get_contents 返回的字节流、输出环境四者不一致。
- 统一用 UTF-8:保存 PHP 文件时选 UTF-8 无 BOM,目标文件也用 UTF-8 编码(可用
iconv -f gbk -t utf-8 source.txt > target.txt转) -
file_get_contents返回的是原始字节,不自动转码;如果文件是 GBK,就得手动mb_convert_encoding($content, 'UTF-8', 'GBK') - 用
SplFileObject读 CSV 或带 BOM 的文件更稳:$file = new SplFileObject($path); $file->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY); - 浏览器输出中文前记得设 header:
header('Content-Type: text/plain; charset=utf-8');,否则看的是乱码,不是存的乱码
真正卡住人的从来不是语法,而是 file_put_contents 返回 false 却没查 error_get_last(),或是 fgets 在长行上静默失败,又或者路径拼出来是 ../etc/passwd 还浑然不觉。这些点不盯住,写一百遍教程也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











