判断视频文件是否无效需先验证文件存在且可读,再用 getID3 检查 video 信息及 error 状态,或调用 ffprobe 校验音视频流与关键元数据,同时注意并发安全、路径合法性及关联文件保护。

如何判断视频文件是否无效
PHP 本身不解析视频内容,所谓“无效”通常指:文件损坏、无法被解码、元信息缺失、或根本不是视频格式。不能只靠扩展名(如 .mp4)判断——用户可能改名伪造。实际清理前必须做两层验证:文件存在且可读 + 能被 FFmpeg 或 PHP 的 getid3 库成功解析出有效音视频流。
用 getid3 检查视频流是否真实存在
getid3 是最轻量、兼容性最好的 PHP 视频元数据检查方案。它不依赖外部命令,适合 Web 环境。安装后关键看 $info['video']['dataformat'] 和 $info['video']['bitrate'] 是否非空,同时确保 $info['error'] 为空数组。
require_once 'getid3/getid3.php';
$getID3 = new getID3();
$info = $getID3->analyze($filepath);
if (empty($info['video']) || !isset($info['video']['dataformat']) || !empty($info['error'])) {
// 视频流缺失或解析失败,视为无效
unlink($filepath);
}
用 shell_exec 调用 ffprobe 做更严格的校验
当需要确认帧率、时长、关键帧是否存在等深层指标时,ffprobe 更可靠。但要注意:shell_exec 可能被禁用;路径需绝对;超时要控制;输出需过滤 stderr。
-
ffprobe -v error -show_entries format=duration -of default=nw=1返回空或报错 → 时长不可读 -
ffprobe -v quiet -show_entries stream=codec_type -of csv=p=0输出不含video→ 无视频流 - 建议加
timeout 5s防止卡死(Linux),Windows 用start /wait timeout /t 5 && ffprobe ...
批量清理时注意文件锁与并发安全
直接 unlink() 大量文件可能触发 I/O 阻塞,尤其在 NFS 或低配 VPS 上。更稳妥的做法是先生成待删列表,再分批执行,并跳过正在被 Web 服务(如 Nginx 的 sendfile)或转码进程占用的文件。
Magic CMS网站管理系统(政企版)采用PHP+Mysql架构,再原CMS系统的基础上精简出适合企业政府客户使用版本,继承了原系统的快捷,高效,灵活,实用的特点,保留了核心功能,系统支持自定义模版(极易整合dede模板)、支持扩展插件,自定义模型等功能,保留了文章模型,视频模型,图集模型,产品模型,能够胜任企业多种建站需求。BUG修复:1.修改了程序安装时部分数据无法正常导入的错误2.修改了程
立即学习“PHP免费学习笔记(深入)”;
- 用
stream_is_local($filepath)排除远程 URL - 用
is_writable($filepath)和fopen($filepath, 'r')测试是否可读(避免权限导致的静默失败) - 对大目录,用
RecursiveDirectoryIterator配合continue on Exception防止单个坏文件中断整个流程
真正难的不是删文件,而是确认“删对了”——比如封面图和缩略图常与视频同名但不同扩展,一并删掉就丢数据。务必在 unlink 前打印日志或写入隔离目录留痕。










