php 实现边播边下载
边播边下载的实现原理
边播边下载(渐进式下载)的核心是将媒体文件分块传输,播放器可以一边下载一边播放已下载的部分。HTTP协议本身支持范围请求(Range Requests),这是实现该功能的基础。
使用PHP实现的基本步骤
创建PHP脚本处理媒体文件请求,解析Range头信息,返回指定范围的数据。以下是一个基本实现示例:
<?php
$filePath = 'path/to/your/media.mp4';
$fileSize = filesize($filePath);
$file = fopen($filePath, 'rb');
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);
$start = intval($start);
$end = $end === '' ? $fileSize - 1 : intval($end);
header('HTTP/1.1 206 Partial Content');
header("Content-Range: bytes $start-$end/$fileSize");
header('Content-Length: ' . ($end - $start + 1));
fseek($file, $start);
echo fread($file, $end - $start + 1);
} else {
header('Content-Length: ' . $fileSize);
echo fread($file, $fileSize);
}
fclose($file);
?>
HTML5视频播放器集成
在HTML页面中使用<video>标签引用PHP处理脚本:
<video controls>
<source src="stream.php?file=media.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
优化和注意事项
确保服务器正确配置了MIME类型,视频文件应具有正确的扩展名和内容类型。
对于大型文件,考虑增加缓冲控制逻辑,避免一次性读取整个文件到内存。
检查服务器是否支持HTTP/1.1和范围请求,某些旧服务器可能需要额外配置。
安全考虑
验证用户请求的文件路径,防止目录遍历攻击:
$requestedFile = basename($_GET['file']);
$filePath = 'media/' . $requestedFile;
if (!file_exists($filePath)) {
header('HTTP/1.0 404 Not Found');
exit;
}
性能优化
考虑使用X-Sendfile(Apache)或X-Accel-Redirect(Nginx)等服务器特性来提高性能,避免PHP进程成为瓶颈。
对于高流量场景,建议使用专门的媒体服务器或CDN服务来处理媒体流。







