php读写本地文本文件应据文件大小与需求选函数:小文件用file_get_contents/file_put_contents;大文件或需逐行处理则用fopen配合fgets/fread;操作前须检查路径合法性、读写权限及utf-8编码一致性。

PHP 读写本地文本文件,关键在选对函数、注意权限和编码。小文件用 file_get_contents 和 file_put_contents 最快;大文件或需逐行处理时,必须用 fopen 配合 fgets 或 fread;所有操作前都应检查路径合法性与读写权限。
读取文本文件的三种常用方式
根据文件大小和处理需求选择合适方法:
-
小文件(几 MB 内)直接读成字符串:用
file_get_contents('data.txt')。返回整个内容,失败返回false,记得加file_exists()和is_readable()判断。 -
按行处理日志或 CSV 等结构化文本:用
fopen('log.txt', 'r')打开后循环调用fgets($fp),每行自动带换行符,适合边读边过滤或统计。 -
把文件转为数组方便索引操作:
$lines = file('config.ini');每行为一个数组元素,含换行符;注意该函数不适用于超大文件,会一次性加载全部内容到内存。
写入与追加文本内容
覆盖写入和追加写入逻辑不同,模式参数不能错:
-
覆盖写入(清空原内容):用
file_put_contents('out.txt', $text),默认行为是清空再写;也可显式指定FILE_TRUNC(但这是默认值,通常不用写)。 -
追加内容到末尾:加
FILE_APPEND标志,例如file_put_contents('log.txt', "[$time] error\n", FILE_APPEND);若同时要防并发冲突,可叠加LOCK_EX加写锁。 -
用 fopen 控制更细粒度写入:打开时用
'w'模式会清空,'a'模式自动定位到末尾;写完务必fclose(),否则内容可能未真正落盘。
安全与稳定性要点
生产环境不能只管功能通不通,还要防路径穿越、权限不足、中文乱码等问题:
-
路径必须规范且受限:用
realpath($path)获取绝对路径,再判断是否在允许目录内,比如strpos(realpath($path), '/var/www/data') === 0。 -
写入前确认父目录可写:仅
is_writable($file)不够,因为文件可能还不存在;应检查is_writable(dirname($file))。 -
中文内容确保 UTF-8 编码一致:PHP 默认按字节操作,若源文件是 GBK,需用
mb_convert_encoding($content, 'UTF-8', 'GBK')转换后再写入,否则显示为乱码。
常见错误及快速排查
多数报错不是代码写错,而是运行环境没配好:
-
failed to open stream:先确认文件路径存在、Web 进程用户(如 www-data)有读/写权限、SELinux 或 open_basedir 没拦截。 - 写入后为空或乱码:检查 fopen 模式是不是误用了
'w'覆盖了内容;确认输出没被ob_start()缓存住而未flush()。 - fgets() 卡住或返回 false:可能是文件正被其他进程独占写入,或磁盘已满;建议配合
stream_set_timeout($fp, 5)设置超时避免阻塞。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











