php实现边播边下载
边播边下载的实现原理
边播边下载(也称为渐进式下载或流式下载)的核心是将媒体文件分块传输,客户端在下载部分内容后即可开始播放,同时后台继续下载剩余部分。PHP可通过控制HTTP响应头和数据分块传输实现这一功能。
设置必要的HTTP头
正确的HTTP头是实现边播边下载的关键。需要设置Accept-Ranges、Content-Length和Content-Type等头部信息:

header("Accept-Ranges: bytes");
header("Content-Type: video/mp4"); // 根据实际媒体类型调整
header("Content-Length: " . filesize($file_path));
处理范围请求
客户端会发送Range头请求特定字节范围,服务端需解析并返回对应数据块:
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($file_path) - 1, $end ? intval($end) : $start + 1024 * 1024);
header("HTTP/1.1 206 Partial Content");
header("Content-Range: bytes $start-$end/" . filesize($file_path));
header("Content-Length: " . ($end - $start + 1));
$fp = fopen($file_path, 'rb');
fseek($fp, $start);
$length = $end - $start + 1;
$buffer = 1024 * 8;
while (!feof($fp) && $length > 0) {
$read = ($length > $buffer) ? $buffer : $length;
echo fread($fp, $read);
$length -= $read;
flush();
}
fclose($fp);
}
完整文件下载处理
如果客户端未发送Range头,则返回完整文件:

else {
readfile($file_path);
}
优化性能的建议
使用X-Sendfile(需服务器支持)可减轻PHP进程负担:
header("X-Sendfile: " . realpath($file_path));
启用输出缓冲控制:
ob_end_clean();
ob_start();
注意事项
确保服务器支持字节范围请求,测试时可用curl -I检查响应头。大文件处理需注意内存管理,避免直接使用file_get_contents。对于MP4文件,建议确保元数据(moov atom)位于文件头部以便快速启动播放。






