thinkphp搭建短视频平台后端的关键是上传稳、存储安、播放顺:需三重上传校验、range流式响应支持拖动、hls转码适配高并发与ios,并强化权限控制与队列异步处理。

ThinkPHP搭建短视频平台后端,关键不在“能不能传”,而在“传得稳、存得安、播得顺”。核心是两件事:上传环节防失控,播放环节撑得住——尤其面对大视频文件时,普通readfile或直接输出会内存爆掉、卡死响应、不支持拖动。
视频上传:别只调move(),先过三关
上传失败90%不是代码问题,而是环境或校验缺失。必须做三重拦截:
-
表单与协议层:HTML表单必须带
enctype="multipart/form-data";<input type="file" name="video">的name值要和后端request()->file('video')完全一致;Nginx需配置client_max_body_size 512M,PHP需确认upload_max_filesize=512M且post_max_size=600M -
真实性校验层:禁用前端
accept和扩展名判断,改用ThinkPHP的validate()读取文件头:$file->validate(['ext' => 'mp4,mov,webm', 'type' => 'video/mp4,video/quicktime,video/webm', 'size' => 536870912]) -
安全落盘层:保存路径必须是
public/uploads/raw/这类Web可访问目录(不能是runtime/);用sha1_file($tmp)或uniqid().rand(100,999)重命名,避免覆盖与路径遍历;成功后返回结构化JSON:['url' => '/uploads/raw/xxx.mp4', 'size' => 12345678]
流式播放:MP4支持Range请求是底线
浏览器拖动进度条、暂停续播,依赖HTTP Range请求。ThinkPHP控制器不能简单readfile(),必须手动处理字节范围并返回206状态码:
- 检查请求头:
$range = $request->header('range'),匹配bytes=0-1023格式 - 解析起止位置:
list($start, $end) = explode('-', substr($range, 6)),$end未指定则设为filesize($path) - 1 - 设置响应头:
Content-Type: video/mp4、Accept-Ranges: bytes、Content-Range: bytes $start-$end/$total、Content-Length: $length - 分段输出:
$fp = fopen($path, 'rb');→fseek($fp, $start);→fpassthru($fp);→fclose($fp),全程不加载全文件到内存
HLS方案:适合高并发与跨终端场景
当用户量上升或需兼容iOS/Safari时,MP4直播易卡顿,应转HLS(.m3u8 + .ts)。流程是上传后异步触发FFmpeg转码:
- 转码命令示例:
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -hls_time 8 -hls_list_size 0 -f hls output.m3u8,输出到public/uploads/hls/{id}/ - 数据库记录
hls_path字段,播放页(如play.php?id=123)查出路径后渲染含hls.js的页面 - .ts分片需代理鉴权:单独写
proxy/hls.php?file=xxx.ts,校验用户权限后再readfile(),防止未授权下载整套分片 - Nginx需添加MIME类型映射:
types { application/vnd.apple.mpegurl m3u8; video/MP2T ts; }
权限与稳定性加固
短视频不是静态资源,必须绑定业务逻辑:
- 播放接口开头强制校验登录态(如
Auth::check()),再查视频记录确认status = 'published'且user_id匹配或is_public = 1 - 私有视频或会员专享内容,在Range响应前加权限判断,不满足直接
return json(['msg'=>'无权限'], 403) - 上传与转码建议放入队列(如think-queue),避免同步执行阻塞Web进程;转码完成再更新数据库
hls_path和status - 生产环境禁用
display_errors,所有异常用try-catch包裹,记录日志而非暴露路径、大小等敏感信息
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











