php实现边播边下载
PHP 实现边播边下载的方法
实现边播边下载功能需要结合流媒体传输和文件分块处理技术。以下是具体实现方案:
流媒体服务器配置
配置服务器支持HTTP范围请求(Range Requests),这是实现边播边下载的基础。在Apache或Nginx中启用相应模块:
# Apache配置
LoadModule headers_module modules/mod_headers.so
<FilesMatch "\.(mp4|mov|avi)$">
Header set Accept-Ranges bytes
</FilesMatch>
# Nginx配置
location ~ \.(mp4|mov|avi)$ {
add_header Accept-Ranges bytes;
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
}
文件分块处理
使用PHP读取并输出文件的部分内容,响应客户端的范围请求:

$filePath = '/path/to/video.mp4';
$fileSize = filesize($filePath);
$file = fopen($filePath, 'rb');
// 处理范围请求
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE'];
$range = str_replace('bytes=', '', $range);
list($start, $end) = explode('-', $range);
$start = max(0, intval($start));
$end = min($fileSize - 1, empty($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 video标签原生支持范围请求,可以直接使用:
<video controls>
<source src="stream.php?file=video.mp4" type="video/mp4">
</video>
下载进度跟踪
记录已下载的字节范围到数据库或文件:

// 记录下载进度
$downloadedRanges = [];
if (isset($_SERVER['HTTP_RANGE'])) {
$range = parseRange($_SERVER['HTTP_RANGE']);
$downloadedRanges[] = $range;
saveDownloadProgress($userId, $fileId, $downloadedRanges);
}
断点续传实现
合并已下载的片段并验证文件完整性:
function mergeChunks($fileId, $totalSize) {
$chunks = getDownloadedChunks($fileId);
$tempFile = tempnam(sys_get_temp_dir(), 'download_');
$fp = fopen($tempFile, 'wb');
foreach ($chunks as $chunk) {
$chunkFile = getChunkFilePath($fileId, $chunk['start'], $chunk['end']);
fwrite($fp, file_get_contents($chunkFile));
}
fclose($fp);
if (filesize($tempFile) === $totalSize) {
rename($tempFile, getFinalFilePath($fileId));
return true;
}
return false;
}
注意事项
确保服务器有足够的内存处理大文件分块。对于超大文件建议使用内存映射或流式处理。视频文件需要支持流式播放格式如MP4(H.264编码),FLV等格式可能需要转码。
安全方面需要验证用户权限和文件路径,防止目录遍历攻击。考虑添加防盗链措施保护视频资源。






