php安全获取视频原始信息应调用ffprobe命令,需检查$return_code是否为0,路径须用escapeshellarg()转义;上传大视频需同步调整php、nginx/apache配置并配合前端分片;生成缩略图时-ss必须置于-i前;处理后须显式清理临时文件。

PHP如何安全获取视频文件的原始信息
直接用 getimagesize() 读视频会失败,它只认图片 MIME;正确做法是用 ffprobe(FFmpeg 工具)或 PHP 的 stream_get_meta_data() + finfo_open() 组合判断。但后者只能识别格式,无法读时长、分辨率等关键元数据。
推荐方案:调用系统级 ffprobe,前提是服务器已安装 FFmpeg:
exec('ffprobe -v quiet -show_entries format=duration,bit_rate -of default=nw=1:nk=1 /path/to/video.mp4 2>&1', $output, $return_code);
注意:$return_code 必须为 0 才代表成功;若返回非零值,常见原因是路径含空格未转义、SELinux 限制、或 ffprobe 不在 PATH 中。建议用 escapeshellarg() 包裹路径:
-
escapeshellarg('/var/www/uploads/2024-07-12 15:30.mp4')能避免空格和特殊字符导致命令截断 - 不要用
shell_exec()直接拼接用户上传的文件名,否则存在命令注入风险 - 若无法装 FFmpeg,可用
getID3库替代,但对 HEVC/H.265 视频支持有限
PHP上传大视频时如何避免超时与内存溢出
默认的 upload_max_filesize 和 post_max_size 通常设为 8M,上传 500MB 视频必然失败。光改 PHP 配置还不够,Nginx/Apache 层也有拦截。
实操要点:
- Nginx 需加
client_max_body_size 2G;到 server 或 location 块,并重载配置 - PHP-FPM 中若用
pm = ondemand,大文件上传可能触发子进程回收,建议改用pm = static并调高pm.max_children -
max_execution_time设为 0(不限制)仅适用于 CLI;Web 模式下建议设为 300+ 秒,并配合前端分片上传(如axios+FileReader)降低单次请求压力 - 上传后立即用
move_uploaded_file()移走文件,避免$_FILES临时文件被自动清理
PHP生成视频缩略图的关键参数与坑点
依赖 ffmpeg 命令行,核心是 -ss(定位)和 -vframes 1(取一帧)。顺序错了会导致耗时暴增——-ss 放在 -i 之前是“快进式定位”,放之后是“解码式定位”。
正确写法:
ffmpeg -ss 00:01:30 -i input.mp4 -vframes 1 -q:v 2 output.jpg
常见问题:
-
-q:v 2控制 JPEG 质量(1~31,值越小质量越高),不设该参数可能导致缩略图模糊发灰 - 某些 MP4 容器无关键帧(I-frame)在指定时间点,
-ss会自动跳到最近前一个关键帧,造成时间偏差;可加-noaccurate_seek强制精确但更慢 - 输出尺寸建议显式指定
-s 320x180,否则不同视频分辨率缩略图大小不一致 - 务必检查
exec()返回值,FFmpeg 出错时 stderr 不会进$output,要用2>&1重定向捕获
PHP处理完视频后如何清理临时资源
FFmpeg 转码或截图过程会产生大量临时文件(如 /tmp/ffmpeg-xxx),且 PHP 进程退出后不会自动清理。尤其在并发上传场景下,磁盘可能被撑爆。
必须手动管理:
- 所有
exec()命令中,用tempnam(sys_get_temp_dir(), 'vid_')显式创建临时目录,便于统一清理 - 转码完成后,用
unlink()删除原始上传临时文件,再用rrmdir()(自定义递归删除函数)清空临时目录 - 不要依赖
register_shutdown_function()清理——它在脚本异常终止时可能不执行;应在主逻辑末尾显式调用清理 - 若使用队列(如 Redis + Supervisor),清理动作应放在 worker 进程内,而非 Web 请求响应后
缩略图路径、转码结果路径、临时目录路径,三者必须严格分离,混用会导致误删或覆盖。尤其注意 Windows 下路径分隔符差异——统一用 dirname(__FILE__) . DIRECTORY_SEPARATOR 拼接。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











