thinkphp中删除文件需区分场景:删数据库记录用模型delete()/destroy(),删服务器物理文件用unlink()或think\file类,删目录需递归处理,严禁混淆;推荐优先使用think\file保障安全性。

ThinkPHP 中删除文件不是靠数据库 delete 方法,而是用 PHP 原生函数或框架封装的文件操作类。数据库里的“删除”是删记录,服务器上的“删除文件”是删物理路径下的 .php、.html、日志、上传图片等真实文件。
确认你要删的是哪类“文件”
先分清场景,避免误删:
-
删数据库记录:用模型的
delete()或destroy(),比如Teacher::destroy($id) -
删服务器上的普通文件(如上传的图片、临时缓存、日志):用
unlink()或think\File类 -
删整个目录及其内容:需递归删除,不能只用
rmdir() - 删控制器/模型/视图文件本身:直接在项目目录里手动删(开发阶段),上线后一般不删源码文件
删单个文件(推荐用 think\File)
ThinkPHP 5+ 提供了更安全的文件操作支持。例如删除用户头像:
use think\File;
$file = new File('./public/uploads/avatar_123.jpg');
if ($file->isFile()) {
$file->delete(); // 安全删除,自动检查是否存在、是否为文件
}
比裸写 unlink() 更稳妥,避免 Warning 或静默失败。
删上传后的文件(配合数据库记录一起处理)
典型流程:先删文件,再删数据库记录。顺序不能反,否则文件残留成“孤儿”:
- 从数据库查出该记录的
file_path字段值(如uploads/resume_456.pdf) - 拼完整物理路径:
ROOT_PATH . 'public/' . $file_path - 用
is_file()判断存在,再unlink()或File::delete() - 最后执行
Resume::destroy($id)删除数据库行
批量删文件或清空上传目录(谨慎使用)
比如清空临时上传目录 runtime/upload:
$dir = RUNTIME_PATH . 'upload/';
if (is_dir($dir)) {
array_map('unlink', glob($dir . '*'));
}
注意:glob() 不递归子目录;如需深度清理,建议用自定义递归函数或第三方工具,上线前务必测试路径和权限。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











