PHP文件操作详解(读取、写入、删除)
一、文件读取
PHP提供了多种文件读取方式,开发者可根据需求选择不同方法:
1、file_get_contents()
适合一次性读取整个文件内容,返回字符串。无需手动处理文件句柄,适合小文件。
示例:
$content = file_get_contents('example.txt');
echo $content;
特点:简洁高效,但内存占用较高,不适用于大文件。
2、fread()
+ fopen()
需配合文件句柄操作,适合分块读取大文件。需手动关闭文件句柄。
示例:
$handle = fopen('example.txt', 'r');
$content = fread($handle, filesize('example.txt'));
fclose($handle);
注意:fread()
需指定读取字节数,常用filesize()
获取文件总大小。
3、逐行读取:fgets()
每次读取一行内容,适用于按行处理文本文件(如CSV)。
示例:
$handle = fopen('example.txt', 'r');
while (!feof($handle)) {
echo fgets($handle) . "<br>";
}
fclose($handle);
特点:自动移动指针至下一行,可结合feof()
判断文件末尾。
4、file()
函数
将文件内容按行存入数组,每行为数组元素。
示例:
$lines = file('example.txt');
foreach ($lines as $line) {
echo $line;
}
适用场景:需逐行处理且需要保留行结构时。
5、readfile()
直接输出文件内容到输出缓冲区,返回读取字节数。适合快速下载或输出文件。
示例:
readfile('example.txt');
注意:无需缓冲处理,但无法对内容进行中间操作。
二、文件写入
PHP的写入操作涵盖基础写入、追加内容和并发控制:
1、file_put_contents()
简化写入操作,支持多种模式:
// 覆盖写入
file_put_contents('example.txt', 'Hello World');
// 追加内容(使用FILE_APPEND)
file_put_contents('example.txt', "\nNew Line", FILE_APPEND | LOCK_EX);
参数说明:
-
FILE_APPEND
:追加而非覆盖LOCK_EX
:写入时独占锁定文件
特点:自动处理文件句柄,适合简单场景。
-
fwrite()
+fopen()
提供更细粒度的控制,如文件锁定。示例(带锁实现):
$handle = fopen('example.txt', 'w');
flock($handle, LOCK_EX); // 加锁防止并发冲突
fwrite($handle, 'Content');
flock($handle, LOCK_UN); // 解锁
fclose($handle);
适用场景:需保证数据一致性的高并发写入。
3.目录创建与写入
写入前需确保目录存在,可使用mkdir()
创建目录:
if (!file_exists('/path/to/dir')) {
mkdir('/path/to/dir', 0755, true); // 递归创建目录
}
注意:权限参数(如0755)需根据服务器环境调整。
三、文件删除
1、删除文件:unlink()
删除指定路径的文件,返回布尔值表示操作结果:
if (unlink('example.txt')) {
echo '文件已删除';
} else {
echo '删除失败(权限不足或文件不存在)';
}
注意:PHP只能删除运行用户权限内的文件。
2、删除目录:rmdir()
仅能删除空目录。若需删除非空目录,需先递归删除内部文件:
function deleteDirectory($dir) {
$files = array_diff(scandir($dir), ['.', '..']);
foreach ($files as $file) {
$path = "$dir/$file";
is_dir($path) ? deleteDirectory($path) : unlink($path);
}
return rmdir($dir);
}
deleteDirectory('example_dir');
关键点:
scandir()
获取目录内容- 递归处理子目录
- 最后调用
rmdir()
删除空目录。
四、注意事项
1、错误处理
使用try...catch
或@
抑制错误,避免因权限问题导致脚本中断:
try {
file_put_contents('example.txt', 'data', LOCK_EX);
} catch (Exception $e) {
echo "错误:{$e->getMessage()}";
}
2、文件锁机制
多进程/线程环境下,使用flock()
避免写入冲突。
3、性能优化
- 大文件读取优先使用
fread()
分块处理 - 频繁写入时,
file_put_contents()
的LOCK_EX
可能影响性能,需权衡一致性需求。
通过灵活组合上述函数,可满足从简单日志记录到复杂文件管理的各类需求。