首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >教你从0开始搭建php直播系统完整教程

教你从0开始搭建php直播系统完整教程

原创
作者头像
钠斯音视频开发-林经理
发布2025-10-23 10:53:24
发布2025-10-23 10:53:24
10900
代码可运行
举报
文章被收录于专栏:音视频开发音视频开发
运行总次数:0
代码可运行

下面是一份详细、实操性强的 《PHP直播系统搭建教程》,适合希望从源码层面或框架层面搭建完整直播平台的开发者。 本文将从系统结构、环境部署、推拉流配置、PHP服务端开发、前端播放集成等角度讲解。


一、整体架构概览

一个完整的 PHP直播系统 一般由以下五个核心模块组成:

  1. 推流端(主播端)
    • 使用 OBS、推流SDK 或 App 端推流(RTMP 协议)。
    • 推流地址格式一般为: rtmp://yourdomain.com/live/streamkey
  2. 流媒体服务器(中间层)
    • 用于接收推流、转码、分发。
    • 常用开源方案:
      • Nginx-RTMP(轻量,适合小型项目)
      • SRS(Simple Realtime Server)(推荐,性能好、支持WebRTC)
      • ZLMediaKit(支持多协议、C++高性能)
  3. 播放端(观众端)
    • 播放协议:RTMP(低延迟)、HLS(兼容性强)、FLV、WebRTC。
    • Web 播放器常用:
      • flv.js / hls.js
      • video.js + 插件
  1. 业务服务端(PHP实现)
    • 功能:房间管理、用户鉴权、弹幕、礼物、统计、接口API。
    • 部署方式:LNMP(Linux + Nginx + MySQL + PHP)。
  2. 数据库与缓存
    • MySQL:存储用户、直播
您说:

php直播系统搭建教程

ChatGPT 说:

已思考 6s

PHP 直播系统搭建教程(从零到可运行)

下面是一份实操性强、可直接复制运行的 PHP + 流媒体 直播系统搭建指南。覆盖环境、流媒体服务器选择与配置、PHP 后端核心代码示例、前端播放集成、鉴权、部署与扩展建议。直接照做即可得到一个可推流、可观看、带基本鉴权与房间管理的直播系统原型。


一、整体架构(简短)

  1. 主播推流:OBS / 手机 RTMP 推流到流媒体服务器(rtmp://stream.example.com/live/streamkey)。
  2. 流媒体服务器:接收 RTMP、生成 HLS/FLV/WebRTC 分发(常见:SRS、ZLMediaKit、Nginx-RTMP)。
  3. PHP 后端:房间管理、生成/验证 streamkey、鉴权、礼物/弹幕接口、数据持久化(MySQL)、缓存(Redis)。
  4. 前端播放:网页端使用 flv.js(FLV over HTTP-FLV)或 hls.js(HLS),移动端用原生播放器或 SDK。
  5. 数据库/缓存:MySQL 存用户和房间,Redis 做在线状态/并发控制/防刷。

二、准备工作(环境/软件)

  • Linux(推荐:Ubuntu 20.04 / CentOS 7+)
  • PHP 8.x(fpm)、Nginx、Composer
  • MySQL 5.7+/8.0 或 MariaDB
  • Redis(可选但推荐)
  • 流媒体服务器:SRS / ZLMediaKit / Nginx-RTMP(示例同时给出 Nginx-RTMP 和 SRS 常用配置)
  • 前端库:flv.js / hls.js / video.js

三、数据库设计(核心表)

下面给出最简化的 SQL,支持用户与直播房间、流 key 管理、观看统计。

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE `users` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(64) NOT NULL,
  `password_hash` VARCHAR(255) NOT NULL,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE `rooms` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `owner_id` INT NOT NULL,
  `title` VARCHAR(255),
  `stream_key` VARCHAR(64) NOT NULL,
  `is_live` TINYINT(1) DEFAULT 0,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX(owner_id),
  FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE TABLE `views` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `room_id` INT NOT NULL,
  `user_id` INT NULL,
  `ts` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX(room_id),
  FOREIGN KEY (room_id) REFERENCES rooms(id) ON DELETE CASCADE
);

实际系统还需礼物、弹幕、调度、日志表等。


四、流媒体服务器配置示例

A. 方案选择建议(简短)

  • 小型测试/轻量:Nginx-RTMP。简单,易上手。
  • 推荐生产:SRSZLMediaKit(性能、WebRTC 支持、稳定)。 下面给出 Nginx-RTMPSRS(最小) 的示例配置。

B. Nginx + nginx-rtmp 基本配置

安装 nginx + nginx-rtmp 模块(在 Ubuntu 通常编译或用已打包版本)。 在 nginx.conf 中加入 rtmp 段:

代码语言:javascript
代码运行次数:0
运行
复制
# nginx.conf (只展示 rtmp 部分)
rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;
            # 允许推流鉴权(可选): on_publish 指向内部 HTTP 验证 URL
            on_publish http://127.0.0.1:9000/auth/on_publish;
            on_publish_done http://127.0.0.1:9000/auth/on_publish_done;

            # 将流导出为 HLS
            hls on;
            hls_path /var/www/hls;
            hls_fragment 3s;
            hls_playlist_length 15s;
        }
    }
}
  • on_publish 用于推流前后调用你的 PHP 鉴权接口(返回 2xx 表示允许)。
  • HLS 输出目录需被 Nginx 静态服务。

C. SRS(最小 RTMP/HLS)示例

SRS 的 conf/srs.conf(极简):

代码语言:javascript
代码运行次数:0
运行
复制
listen              1935;
max_connections     1000;

vhost __defaultVhost__ {
    mode            static;
    min_latency     on;

    hls {
        enabled         on;
        hls_path        ./objs/nginx/html/hls;
        hls_fragment    3;
        hls_window      15;
    }

    http_api {
        enabled         on;
        listen          1985;
    }

    rtc {
        enabled on;
    }
}

SRS 支持 HTTP API,用于获取流状态、断线回调、转码等。生产环境建议阅读官方文档调参。


五、PHP 后端:核心功能示例

1) 生成与验证 stream_key(示例)

generate_stream_key.php(仅示例逻辑):

代码语言:javascript
代码运行次数:0
运行
复制
<?php
// 简单示例,生产请用更强随机与权限校验
function gen_stream_key($userId) {
    return bin2hex(random_bytes(16)) . '-' . $userId;
}

// 保存到 rooms 表(PDO 示例)
$pdo = new PDO('mysql:host=127.0.0.1;dbname=live', 'root', 'pwd');
$userId = 1; // 假设
$streamKey = gen_stream_key($userId);
$stmt = $pdo->prepare("INSERT INTO rooms (owner_id, title, stream_key) VALUES (?, ?, ?)");
$stmt->execute([$userId, '我的直播间', $streamKey]);
echo "stream_key: $streamKey\n";

2) RTMP 推流鉴权(on_publish 回调)

当 nginx-rtmp 收到推流尝试,会 POST 一些参数到你配置的 URL。示例 on_publish_auth.php

代码语言:javascript
代码运行次数:0
运行
复制
<?php
// 接收 nginx-rtmp 的回调(on_publish)
$stream = $_POST['name'] ?? ''; // stream key
$ip = $_SERVER['REMOTE_ADDR'] ?? '';

header('Content-Type: text/plain');

// 简单验证:检查 stream 存在并且对应 owner
$pdo = new PDO('mysql:host=127.0.0.1;dbname=live', 'root', 'pwd');
$stmt = $pdo->prepare("SELECT id FROM rooms WHERE stream_key = ? LIMIT 1");
$stmt->execute([$stream]);
$room = $stmt->fetch(PDO::FETCH_ASSOC);
if ($room) {
    http_response_code(200);
    echo "OK";
} else {
    http_response_code(403);
    echo "Forbidden";
}

nginx-rtmp 要求 2xx 才允许推流。

3) 前端访问鉴权(播放时的短期 token)

生成短期 token 防止未授权分享真实播放地址。

代码语言:javascript
代码运行次数:0
运行
复制
<?php
function create_play_token($roomId, $secret, $expireSec=300) {
    $expire = time() + $expireSec;
    $payload = $roomId . '|' . $expire;
    $sig = hash_hmac('sha256', $payload, $secret);
    return base64_encode($payload . '|' . $sig);
}

function verify_play_token($token, $secret) {
    $raw = base64_decode($token);
    list($roomId, $expire, $sig) = explode('|', $raw);
    if (time() > (int)$expire) return false;
    $expected = hash_hmac('sha256', $roomId . '|' . $expire, $secret);
    return hash_equals($expected, $sig) ? intval($roomId) : false;
}

播放页请求先向 PHP 获取 play_token,PHP 验证用户权限后返回 token,播放端把 token 加到 HLS/FLV 请求(如 ?token=xxxx),Nginx 或后端再校验 token 并返回流。


六、前端播放集成(网页示例)

A. 使用 flv.js(在浏览器拉 FLV from HTTP-FLV)

适用于从流媒体服务器导出的 FLV(例如通过 SRS 的 http-flv)。

代码语言:javascript
代码运行次数:0
运行
复制
<!doctype html>
<html>
<head><meta charset="utf-8"><title>FLV Player</title></head>
<body>
<video id="videoElement" controls autoplay playsinline style="width:100%;max-width:720px"></video>
<script src="https://unpkg.com/flv.js@latest/dist/flv.min.js"></script>
<script>
if (flvjs.isSupported()) {
  var videoElement = document.getElementById('videoElement');
  var flvPlayer = flvjs.createPlayer({
    type: 'flv',
    url: 'http://stream.example.com/live/room123.flv?token=PASTE_TOKEN'
  });
  flvPlayer.attachMediaElement(videoElement);
  flvPlayer.load();
  flvPlayer.play();
}
</script>
</body>
</html>

B. 使用 hls.js(HLS)

代码语言:javascript
代码运行次数:0
运行
复制
<video id="hlsVideo" controls autoplay style="width:100%;max-width:720px"></video>
<script src="https://unpkg.com/hls.js@latest"></script>
<script>
var video = document.getElementById('hlsVideo');
if (Hls.isSupported()) {
  var hls = new Hls();
  hls.loadSource('https://stream.example.com/hls/room123.m3u8?token=PASTE_TOKEN');
  hls.attachMedia(video);
  hls.on(Hls.Events.MANIFEST_PARSED,function() {
    video.play();
  });
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
  video.src = 'https://stream.example.com/hls/room123.m3u8?token=PASTE_TOKEN';
  video.addEventListener('loadedmetadata',function(){ video.play(); });
}
</script>

七、弹幕、聊天室、礼物(技术点)

  • 弹幕/聊天室用 WebSocket(或 Socket.IO)。PHP 可用 SwooleRatchet 或将即时功能交给 Node.js。
  • 弹幕消息可先写入 Redis(队列),主后端持久化到 MySQL。
  • 礼物走支付与消息队列(确认支付后发通知和扣币逻辑)。

八、常见问题与调优

  1. 延迟高
    • 用 HLS 会有较高延迟(6-30s),用 HTTP-FLV 或 WebRTC 可降到 1-3s。SRS + WebRTC 推荐低延迟。
  2. 卡顿/丢帧
    • 检查推流码率与服务器带宽;客户端网络;转码 CPU 瓶颈。
  3. 并发
    • 读取流交给 CDN(如腾讯云 CDN、阿里云 CDN)分发,或用多台流媒体服务器做负载均衡。
  4. 鉴权失效
    • 使用短期 token(例如 300 秒),并在流媒体服务器旁做 token 校验。Nginx + lua 或 SRS 的 hook 可做到。
  5. 安全
    • TLS(https)保护播放页;防盗链(token);防刷(IP & Redis 限速)。

九、部署建议(生产)

  • 将流媒体服务器与应用服务器分离:流媒体独立机器(高带宽),PHP/Nginx/DB 放在另一组服务器。
  • 将 HLS/FLV 文件放到磁盘或对象存储(例如 OSS)并用 CDN 缓存。
  • 使用容器化(Docker)部署 SRS/ZLMediaKit 便于管理。
  • 日志与指标:Prometheus + Grafana 监控 CPU、带宽、流数量、丢包率等。
  • 自动上线/滚动更新:使用 CI/CD。

十、示例流程(从主播到观众)

  1. 主播登录后台 → 创建房间 → 获取 stream_key
  2. 使用 OBS 设置 rtmp://stream.example.com/live/{stream_key} 推流。
  3. nginx-rtmp/SRS 调用 on_publish 到 PHP 验证 stream_key。验证通过后开始接收流并同时产出 HLS/FLV。
  4. 观众打开房间页面 → 前端请求 PHP 获取临时播放 token。
  5. 前端用 flv.js/hls.js 带 token 请求流地址并播放。
  6. 弹幕/聊天通过 WebSocket 与聊天室服务交互。

十一、从小到大分阶段功能清单(Roadmap)

  • MVP(最小可用):推流鉴权、HLS/FLV 播放、房间管理、简易聊天。
  • V1:礼物/余额系统、观看统计、回放(录制)、移动端支持。
  • V2:低延迟(WebRTC)、连麦、CDN 分发、弹性扩容、私有化部署。
  • 企业版:自研或对接 SDK(RTC、IM)、多区域部署、合规与审计。

十二、附:快速故障排查清单

  • 无法推流:检查 stream_key、on_publish 回调是否返回 2xx、推流地址与端口是否正确、防火墙端口 1935 是否打开。
  • 能推但无法播放:检查 HLS 输出目录是否生成 .m3u8、FLV URL 是否可访问、浏览器控制台和流媒体服务器日志。
  • 视频黑屏但有音频:编码问题(检查 keyframe/codec:H.264 + AAC 建议)。
  • 高 CPU:看 是否启用了转码、转码并发太多需增加硬件。

十三、推荐学习/扩展点

  • 学习 SRS / ZLMediaKit 文档(WebRTC、http-flv、REST API、转推 CDN)。
  • 学会用 ffmpeg 本地测试推流与转码(ffmpeg -re -i sample.mp4 -c copy -f flv rtmp://...)。
  • 熟悉 WebSocket / Swoole(PHP 实时能力)或 Node.js 做聊天室。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、整体架构概览
  • PHP 直播系统搭建教程(从零到可运行)
    • 一、整体架构(简短)
    • 二、准备工作(环境/软件)
    • 三、数据库设计(核心表)
    • 四、流媒体服务器配置示例
      • A. 方案选择建议(简短)
      • B. Nginx + nginx-rtmp 基本配置
      • C. SRS(最小 RTMP/HLS)示例
    • 五、PHP 后端:核心功能示例
      • 1) 生成与验证 stream_key(示例)
      • 2) RTMP 推流鉴权(on_publish 回调)
      • 3) 前端访问鉴权(播放时的短期 token)
    • 六、前端播放集成(网页示例)
      • A. 使用 flv.js(在浏览器拉 FLV from HTTP-FLV)
      • B. 使用 hls.js(HLS)
    • 七、弹幕、聊天室、礼物(技术点)
    • 八、常见问题与调优
    • 九、部署建议(生产)
    • 十、示例流程(从主播到观众)
    • 十一、从小到大分阶段功能清单(Roadmap)
    • 十二、附:快速故障排查清单
    • 十三、推荐学习/扩展点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档