当前位置:首页 > PHP

php实现边播边下载

2026-04-03 12:30:30PHP

实现边播边下载的基本原理

边播边下载(也称为流式下载或渐进式下载)的核心是将媒体文件分块传输,播放器可以逐块加载和播放,无需等待整个文件下载完成。PHP可通过控制HTTP响应头和数据分块传输实现这一功能。

设置正确的HTTP响应头

关键头部包括Accept-RangesContent-LengthContent-Range

php实现边播边下载

header("Accept-Ranges: bytes");
header("Content-Type: video/mp4"); // 根据实际格式调整

处理范围请求(Range Request)

客户端会发送Range头部请求特定字节范围,PHP需解析并返回对应数据块:

$filePath = 'path/to/video.mp4';
$fileSize = filesize($filePath);
$chunkSize = 1024 * 1024; // 1MB分块

if (isset($_SERVER['HTTP_RANGE'])) {
    preg_match('/bytes=(\d+)-(\d+)?/', $_SERVER['HTTP_RANGE'], $matches);
    $start = intval($matches[1]);
    $end = $matches[2] ?? min($start + $chunkSize, $fileSize - 1);
    header("Content-Length: " . ($end - $start + 1));
    header("Content-Range: bytes $start-$end/$fileSize");
    header("HTTP/1.1 206 Partial Content");
} else {
    $start = 0;
    $end = min($chunkSize, $fileSize - 1);
    header("Content-Length: $fileSize");
}

分块读取并输出文件内容

使用fopenfseek定位文件指针,逐块输出数据:

php实现边播边下载

$handle = fopen($filePath, 'rb');
fseek($handle, $start);
$remaining = $end - $start + 1;

while (!feof($handle) && $remaining > 0) {
    $chunk = min(8192, $remaining);
    echo fread($handle, $chunk);
    $remaining -= $chunk;
    flush();
}
fclose($handle);

前端播放器配合

HTML5的<video>标签原生支持范围请求:

<video controls>
    <source src="stream.php?file=video.mp4" type="video/mp4">
</video>

优化与注意事项

大文件处理建议使用内存映射或缓存机制避免内存耗尽。对于私有文件需添加身份验证逻辑。Nginx/Apache等服务器可直接处理静态文件的范围请求,动态生成场景才需PHP实现。

完整示例代码

$file = 'path/to/video.mp4';
if (file_exists($file)) {
    $size = filesize($file);
    $fp = fopen($file, 'rb');

    header("Accept-Ranges: bytes");
    header("Content-Type: video/mp4");

    if (isset($_SERVER['HTTP_RANGE'])) {
        $range = $_SERVER['HTTP_RANGE'];
        list($start, $end) = sscanf($range, "bytes=%d-%d");
        $end = min($end ?? $start + 1024*1024, $size-1);
        header("HTTP/1.1 206 Partial Content");
        header("Content-Length: " . ($end - $start + 1));
        header("Content-Range: bytes $start-$end/$size");
        fseek($fp, $start);
    } else {
        header("Content-Length: $size");
    }

    while (!feof($fp)) {
        echo fread($fp, 8192);
        flush();
    }
    fclose($fp);
}

标签: php边播边
分享给朋友:

相关文章

php记住密码怎么实现

php记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…