PHP怎样清理无效视频文件_PHP清理无效视频文件做法【清理】

13次阅读

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

PHP怎样清理无效视频文件_PHP清理无效视频文件做法【清理】

如何判断视频文件是否无效

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 服务(如 nginxsendfile)或转码进程占用的文件。

立即学习PHP免费学习笔记(深入)”;

  • stream_is_local($filepath) 排除远程 URL
  • is_writable($filepath)fopen($filepath, 'r') 测试是否可读(避免权限导致的静默失败)
  • 对大目录,用 RecursiveDirectoryIterator 配合 continue on Exception 防止单个坏文件中断整个流程

真正难的不是删文件,而是确认“删对了”——比如封面图和缩略图常与视频同名但不同扩展,一并删掉就丢数据。务必在 unlink 前打印日志或写入隔离目录留痕。

text=ZqhQzanResources