在 PHP 开发中,文件操作属于基础能力,但许多开发者容易忽视细节。本文系统梳理文件判断、读写、目录操作与上传的实现要点,这些内容在日常开发中频繁使用,掌握后能有效避免常见问题。
判断与信息获取
判断文件
PHP 提供了多个判断函数,用法直观:
| 函数 | 说明 | 返回值 |
|---|
file_exists($path) | 判断文件或目录是否存在 | bool |
is_file($path) | 判断是否为文件 | bool |
is_dir($path) | 判断是否为目录 | bool |
is_readable($path) | 判断是否可读 | bool |
is_writable($path) | 判断是否可写 | bool |
示例:判断文件是否存在、是否为文件,以及目录是否存在且可写:
获取文件信息
除判断外,获取文件的元信息同样常用:
| 函数 | 说明 |
|---|
filesize($path) | 获取文件大小(字节) |
filemtime($path) | 获取文件最后修改时间(时间戳) |
pathinfo($path) | 获取文件路径信息(目录、文件名、后缀) |
实际用法示例:
";// 获取最后修改时间$mtime = filemtime($file);echo "最后修改时间:" . date('Y-m-d H:i:s', $mtime) . "
";// 获取路径信息$info = pathinfo($file);echo "文件名:" . $info['filename'] . "
";echo "后缀名:" . $info['extension'] . "
";echo "目录:" . $info['dirname'] . "
";?>
文件读写
简单方式:file_get_contents() / file_put_contents()
对于小文件,使用这两个函数最为便捷,一行代码即可完成读写:
// 读取文件内容到字符串$content = file_get_contents(string $filename);// 将字符串写入文件(返回写入的字节数)file_put_contents(string $filename, mixed $data, int $flags = 0);
读取 JSON 配置文件
实际场景:读取配置文件并解析为数组:
写入日志文件(追加模式)
写日志时经常需要追加内容,使用
FILE_APPEND 加锁标志可保证写入安全:
底层方式:fopen() / fwrite() / fclose()
当需要
逐行读取、
处理大文件或
更精细的控制时,应使用这组底层函数。

// 打开文件,返回资源句柄$handle = fopen(string $filename, string $mode);// 写入文件fwrite(resource $handle, string $data);// 读取一行$line = fgets(resource $handle);// 关闭文件fclose(resource $handle);
常用 mode 参数
| 模式 | 说明 |
|---|
r | 只读,指针在文件开头 |
w | 只写,清空文件内容,指针在开头 |
a | 追加,指针在文件末尾 |
r+ | 读写,指针在开头 |
逐行读取大文件(节省内存)
处理GB级别的日志文件时,不宜一次性读入内存。采用逐行读取的方式更为稳妥:
"; } } fclose($handle);}?>
目录操作:创建、删除与遍历
| 函数 | 说明 |
|---|
mkdir($path) | 创建目录 |
rmdir($path) | 删除空目录 |
unlink($path) | 删除文件 |
递归创建多级目录
如需一次创建多级目录(例如
./uploads/2023/10/01),可利用
mkdir 的第三个参数
true 实现递归创建:
遍历目录
scandir()——适用于简单遍历单层目录:
"; }}?>
RecursiveDirectoryIterator——适用于递归遍历多层目录:
getPathname() . " - 大小:" . $file->getSize() . " 字节
";}?>
文件上传:图片上传
文件上传是 Web 开发的常见需求,PHP 通过
$_FILES 超全局变量和
move_uploaded_file() 函数处理。需注意以下几点:验证错误码、限制文件类型、限制文件大小、生成唯一文件名以避免冲突。
2 * 1024 * 1024) { exit('文件大小不能超过 2MB');}// 从临时目录移动到目标目录if (move_uploaded_file($_FILES['a vatar']['tmp_name'], $destPath)) { echo "上传成功!文件路径:" . $destPath;} else { exit('文件移动失败');}?>