php 实现边播边下载
边播边下载的实现方法
在PHP中实现边播边下载功能,通常涉及流媒体处理和文件分块传输。以下是几种常见的方法:
使用PHP流处理
通过PHP的流处理功能,可以逐段读取文件并输出给播放器:
$file = 'video.mp4';
$chunkSize = 1024 * 1024; // 1MB chunks
header('Content-Type: video/mp4');
header('Accept-Ranges: bytes');
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE'];
$range = str_replace('bytes=', '', $range);
list($start, $end) = explode('-', $range);
$length = $end - $start + 1;
header("HTTP/1.1 206 Partial Content");
header("Content-Length: $length");
header("Content-Range: bytes $start-$end/$filesize");
$fp = fopen($file, 'rb');
fseek($fp, $start);
echo fread($fp, $length);
fclose($fp);
} else {
header("Content-Length: ".filesize($file));
readfile($file);
}
使用X-Sendfile模块
对于大型文件,使用X-Sendfile可以更高效地处理文件传输:
$file = '/path/to/video.mp4';
header('Content-Type: video/mp4');
header('Content-Disposition: inline; filename="video.mp4"');
header('X-Sendfile: '.$file);
需要在服务器上安装并启用mod_xsendfile模块。
使用HLS协议
对于更复杂的流媒体需求,可以考虑实现HLS(HTTP Live Streaming):
-
将视频文件转码为HLS格式:
ffmpeg -i input.mp4 -codec: copy -start_number 0 -hls_time 10 -hls_list_size 0 -f hls output.m3u8 -
通过PHP提供播放列表和分片:
$path = 'path/to/hls/files/'; if (isset($_GET['file'])) { $file = $path.basename($_GET['file']); if (file_exists($file)) { header('Content-Type: application/x-mpegURL'); readfile($file); } }
注意事项
- 确保服务器支持字节范围请求(HTTP Range requests)
- 对于大文件,考虑使用内存映射或分块读取避免内存溢出
- 实现适当的缓存控制头以提高性能
- 考虑使用CDN或专门的流媒体服务器处理高并发场景
性能优化建议
- 启用Gzip压缩减少传输量
- 使用缓存控制头(如Cache-Control, ETag)
- 考虑使用Nginx的MP4模块进行高效流传输
- 实现带宽限制防止服务器过载







