在PHP项目开发中,文件内容的读取和写入是非常基础且常用的操作,无论是处理配置文件、日志文件还是用户上传的文件,都需要用到相关功能。下面我们先来看一张示意图片,了解文件读写的基本流程。

一、PHP获取文件内容的常用方法
1. 使用file_get_contents函数
这是最简洁的文件读取方式,适合读取中小型文件,函数会直接将整个文件内容读取为字符串返回,使用起来非常方便。
<?php
// 读取当前目录下的test.txt文件内容
$filePath = './test.txt';
// 判断文件是否存在且可读
if (file_exists($filePath) && is_readable($filePath)) {
$content = file_get_contents($filePath);
// 输出读取到的内容,实际开发中可根据需求处理
echo $content;
} else {
echo '文件不存在或不可读';
}
?>2. 使用fopen配合fread函数
这种方式适合处理大文件,因为可以分块读取,避免一次性加载大文件占用过多内存,灵活性更高。
<?php
$filePath = './test.txt';
// 以只读模式打开文件
$handle = fopen($filePath, 'r');
if ($handle) {
// 分块读取,每次读取1024字节
while (!feof($handle)) {
$chunk = fread($handle, 1024);
// 处理读取到的块内容,这里直接输出
echo $chunk;
}
// 关闭文件句柄
fclose($handle);
} else {
echo '打开文件失败';
}
?>二、PHP写入文件内容的常用方法
1. 使用file_put_contents函数
这是最快捷的写入方式,支持直接写入字符串内容,也可以设置写入模式,默认是覆盖写入,添加FILE_APPEND参数可实现追加写入。
<?php
$targetPath = './new_test.txt';
$writeContent = '这是要写入的文件内容';
// 覆盖写入文件
$result = file_put_contents($targetPath, $writeContent);
if ($result !== false) {
echo '覆盖写入成功,写入字节数:' . $result;
} else {
echo '覆盖写入失败';
}
// 追加写入内容
$appendContent = PHP_EOL . '这是追加的内容';
$appendResult = file_put_contents($targetPath, $appendContent, FILE_APPEND);
if ($appendResult !== false) {
echo '追加写入成功,写入字节数:' . $appendResult;
} else {
echo '追加写入失败';
}
?>2. 使用fopen配合fwrite函数
这种方式同样适合大内容写入,或者需要更精细控制写入过程的场景,比如写入过程中需要处理异常中断的情况。
<?php
$targetPath = './new_test.txt';
$writeContent = '使用fwrite写入的内容';
// 以写入模式打开文件,文件不存在则创建
$handle = fopen($targetPath, 'w');
if ($handle) {
// 写入内容
$writeResult = fwrite($handle, $writeContent);
if ($writeResult !== false) {
echo '写入成功,写入字节数:' . $writeResult;
} else {
echo '写入失败';
}
// 关闭文件句柄
fclose($handle);
} else {
echo '打开文件失败';
}
?>三、完整示例:读取文件内容并写入到新文件
下面是把读取文件和写入文件结合起来的完整示例,实现从源文件读取内容,再写入到目标文件的功能。
<?php
// 源文件路径
$sourceFile = './source.txt';
// 目标文件路径
$targetFile = './target.txt';
// 第一步:读取源文件内容
if (file_exists($sourceFile) && is_readable($sourceFile)) {
$content = file_get_contents($sourceFile);
// 第二步:将内容写入目标文件
$writeResult = file_put_contents($targetFile, $content);
if ($writeResult !== false) {
echo '文件内容读取并写入成功,写入字节数:' . $writeResult;
} else {
echo '写入目标文件失败';
}
} else {
echo '源文件不存在或不可读';
}
?>四、操作注意事项
- 文件路径尽量使用绝对路径,避免相对路径带来的位置偏差问题,可以通过
__DIR__获取当前脚本所在目录。 - 操作前一定要检查文件的读写权限,Linux系统下要注意文件所属用户组和权限设置,避免出现权限不足的错误。
- 如果文件内容包含中文,要注意编码问题,写入时可以指定编码,比如使用
mb_convert_encoding转换编码后再写入。 - 处理大文件时不要使用
file_get_contents一次性读取,改用分块读取的方式,防止内存溢出。 - 写入文件后如果需要立即被访问,可能需要考虑缓存问题,部分场景下需要清除文件缓存。
五、常见问题解答
1. 写入文件返回false是什么原因?
通常是目标文件所在目录没有写入权限,或者目标路径不存在,可以先检查目录权限,使用is_writable函数判断目录是否可写。
2. 读取文件内容出现乱码怎么办?
检查源文件的编码格式,读取后根据需求转换编码,比如源文件是GBK编码,要输出到UTF-8的页面,可以用iconv('GBK', 'UTF-8', $content)转换。
3. 怎么避免写入文件时被其他进程干扰?
可以使用flock函数对文件加锁,在写入前获取独占锁,写入完成后释放锁,避免多个进程同时写入导致内容错乱。
<?php
$handle = fopen('./lock_test.txt', 'w');
if (flock($handle, LOCK_EX)) { // 获取独占锁
fwrite($handle, '加锁后写入的内容');
flock($handle, LOCK_UN); // 释放锁
fclose($handle);
echo '加锁写入成功';
} else {
echo '获取文件锁失败';
}
?>
PHP文件读取文件写入file_get_contentsfile_put_contents修改时间:2026-05-28 16:39:09