php生成视频列表页的核心是扫描目录、提取元信息并输出含video标签的html,需用ffprobe获取时长、过滤非视频文件、校验路径防xss、配置正确MIME类型及CORS。

PHP 读取视频文件并生成 HTML 列表页的核心逻辑
PHP 本身不处理视频解码或播放,它的作用是扫描目录、提取元信息(如文件名、大小、时长)、生成带 标签的 HTML 页面。关键不是“生成视频”,而是“生成能播视频的页面”。
- 必须用
scandir()或glob()获取视频文件路径,注意过滤掉非视频后缀(如.mp4、.webm、.mov) - 用
filesize()和date()获取大小与修改时间,但**无法直接获取视频时长**——PHP 原生不支持,需调用外部工具(如ffprobe)或依赖前端 js 播放器加载后读取duration - 生成的 HTML 必须包含
controls属性,否则用户无法操作;若要自动播放,需同时加autoplay muted(浏览器强制要求静音)
用 PHP + ffprobe 获取真实视频时长(避免前端空等待)
仅靠 PHP 文件系统函数拿不到时长,硬写死或留空会导致列表页体验割裂。推荐在服务端预查一次,把时长存为 json 或写入 HTML data-duration 属性。
function getVideoDuration($path) { $cmd = 'ffprobe -v quiet -show_entries format=duration -of default=nw=1:nk=1 "' . escapeshellarg($path) . '"'; $output = shell_exec($cmd); return round(floatval(trim($output)), 1); } // 示例:遍历目录 $videos = glob('videos/*.mp4'); foreach ($videos as $file) { $duration = getVideoDuration($file); echo ''; }
-
escapeshellarg()必须使用,防止路径含空格或特殊字符导致命令执行失败 - 若服务器没装
ffmpeg,ffprobe会报错——先运行which ffprobe确认存在,否则降级为不显示时长 - 频繁调用
ffprobe有性能开销,建议生成静态 HTML 页或加缓存(如写入videos.json)
生成可点击跳转的视频列表页(非单个 video 标签堆砌)
用户需要的是“列表页”,不是“一堆自动播放的 video 标签”。应以链接形式组织,点击后在新页或 modal 中播放,避免页面卡顿和资源浪费。
- 用
路由,而不是把所有视频都渲染进同一页面 -
play.php接收$_GET['v'],校验后输出单个标签,路径需白名单过滤(如限定在videos/目录下) - 校验示例:
if (strpos($_GET['v'], '..') !== false || !in_array(pathinfo($_GET['v'], PATHINFO_EXTENSION), ['mp4','webm'])) die('Invalid file'); - 避免直接输出用户传入的文件名到 HTML,防止 XSS,始终用
htmlspecialchars()处理显示内容
常见踩坑:MIME 类型缺失、跨域限制、移动端不自动播放
生成的页面跑不起来,大概率不是 PHP 写错了,而是 http 层或浏览器策略挡住了。
立即学习“PHP免费学习笔记(深入)”;
- apache/nginx 需配置正确 MIME 类型,否则
.mp4可能被当成text/plain下载而非播放——检查响应头中Content-Type: video/mp4 - 若视频放在子域名或 CDN,需确保
的src支持 CORS,否则 chrome 控制台报No 'access-Control-Allow-Origin' - 移动端 safari/Chrome 默认禁止自动播放音频,即使加了
autoplay muted,首次交互前也可能静音或暂停——不要依赖自动播放做核心流程 - PHP 输出 HTML 前不能有任何
echo、bom 或空白符,否则可能解析异常(尤其 IE 兼容模式)
实际部署时,最易被忽略的是视频路径的权限控制和 MIME 配置。PHP 只负责拼出 HTML 字符串,剩下的全看 Web 服务器是否放行、浏览器是否信任。