首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >php直播系统源码-系统开发指南

php直播系统源码-系统开发指南

原创
作者头像
钠斯音视频开发-林经理
发布2025-10-24 17:51:57
发布2025-10-24 17:51:57
3174
举报
文章被收录于专栏:音视频开发音视频开发

1 概览 — 目标与定位

目标:用 PHP 构建一个支持 主播推流(RTMP)→ 流媒体转发(HLS/FLV/HTTP-FLV/可选WebRTC)→ 浏览器/移动端播放 的直播平台,具备房间管理、鉴权、弹幕/聊天室、礼物与支付、回放(录制)、基础监控。

适用场景:直播课堂、直播带货、社交直播、企业内网直播(私有化部署)。

2 技术选型(推荐)

  • 流媒体:SRSZLMediaKit(生产推荐 SRS/ZLMediaKit;测试可用 nginx-rtmp)
  • 后端:PHP 8.x + FPM(框架:Laravel / Hyperf / ThinkPHP,根据团队偏好;推荐 Laravel 便于生态)
  • 即时通讯/聊天室:Swoole WebSocket(PHP)或 Node.js + Socket.IO。若要快速上线,也可用第三方 IM(腾讯云 IM、环信)接入。
  • 存储:MySQL(主数据) + Redis(在线状态、限流、短期 token)
  • 缓存/CDN:对象存储(OSS/MinIO)+ CDN(阿里/腾讯/Cloudflare)分发 HLS/TS。
  • 容器与编排:Docker + Docker Compose / Kubernetes(生产)
  • 日志/监控:Prometheus + Grafana + ELK(或 Loki)
  • CI/CD:GitHub Actions / GitLab CI

3 系统架构(分层)

  • 用户/业务层(PHP API) — 房间管理、鉴权、礼物、订单、统计
  • 实时层(WebSocket/IM) — 弹幕、聊天室、连麦信令
  • 流媒体层(SRS/ZLMediaKit) — 接收 RTMP,产出 HTTP-FLV / HLS / WebRTC,提供 HTTP API 回调(on_publish/on_close)
  • 存储层 — MySQL/Redis/对象存储
  • 分发层 — CDN、边缘缓存

4 核心表设计(示例)

代码语言:javascript
复制
-- users, rooms, streams, messages, gifts, orders
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(64), password_hash VARCHAR(255), role TINYINT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE rooms (id INT PRIMARY KEY AUTO_INCREMENT, owner_id INT, title VARCHAR(255), stream_key VARCHAR(128), is_live TINYINT DEFAULT 0, hls_url VARCHAR(512), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE streams (id INT AUTO_INCREMENT PRIMARY KEY, room_id INT, start_at DATETIME, stop_at DATETIME, record_url VARCHAR(512));
CREATE TABLE messages (id BIGINT AUTO_INCREMENT PRIMARY KEY, room_id INT, user_id INT, type VARCHAR(32), content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE gifts (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64), price INT);
CREATE TABLE orders (id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id INT, room_id INT, gift_id INT, amount INT, status VARCHAR(32), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);

5 关键流程与接口(示例)

  1. 主播创建房间 → 后端生成 stream_key(存 rooms)
  2. 主播用 OBS 推流:rtmp://STREAM_SERVER/live/{stream_key}
  3. 流媒体服务收到推流,触发 on_publish 回调到 PHP:PHP 验证 stream_key → 返回 2xx 允许推流 → 更新 rooms.is_live = 1,写入 streams 表 start_at
  4. 观众打开房间页 → 前端向 PHP 请求短期播放 token(签名、过期) → 前端用 flv.js 或 hls.js 拉流(带 token)
  5. 弹幕/聊天室通过 WebSocket(Swoole)连接 → 消息写入 Redis 并广播,落库异步化
  6. 结束推流 → 流媒体触发 on_publish_done → PHP 标记 stop_at、生成回放(若录制)

关键接口示例(REST):

  • POST /api/room/create — 创建房间(返回 stream_key, room_id)
  • POST /api/auth/on_publish — (RTMP callback) 验证推流
  • GET /api/room/{id}/playtoken — 获取短期 play token
  • WS /ws?token=xxx — WebSocket 聊天/弹幕

6 代码片段(简化示例)

6.1 生成 stream_key(Laravel 风格)

代码语言:javascript
复制
function genStreamKey($userId) {
    return bin2hex(random_bytes(16)) . '-' . $userId;
}

6.2 nginx-rtmp / SRS on_publish 验证(示例 PHP)

代码语言:javascript
复制
// on_publish.php
<?php
// nginx-rtmp POST: name, ip, args...
$stream = $_POST['name'] ?? '';
$pdo = new PDO(...);
$stmt = $pdo->prepare("SELECT id FROM rooms WHERE stream_key = ? LIMIT 1");
$stmt->execute([$stream]);
if ($stmt->fetch()) {
    // update is_live etc
    http_response_code(200);
    echo "OK";
} else {
    http_response_code(403);
    echo "Forbidden";
}

6.3 生成播放短期 token(HMAC)

代码语言:javascript
复制
function createPlayToken($roomId, $secret, $expire=300) {
    $exp = time() + $expire;
    $payload = $roomId . '|' . $exp;
    $sig = hash_hmac('sha256', $payload, $secret);
    return base64_encode($payload . '|' . $sig);
}

7 弹幕与聊天室实现建议

  • 轻量:使用 Swoole WebSocket 写 PHP 服务,消息通过 Redis 发布/订阅广播。
  • 大并发:IM 云服务(腾讯云IM/环信)+ 推送;或用专用 XMPP/Matrix/自研基于 C/C++ 的消息服务器。
  • 聊天room隔离、消息限速(每IP/UID每秒n条),用 Redis 计数器实现。

8 安全与鉴权要点

  • 推流:stream_key + on_publish 验证 + IP 白名单(必要时)
  • 播放:短期签名 token(HMAC)+ CDN 防盗链(referer 不可信)
  • 接口:JWT 或 session + HTTPS(强制)
  • 防刷:Redis 限流、机器学习或规则检测异常流量/异常礼物刷单
  • 支付:走合规第三方(微信/支付宝),订单确认后发放礼物/余额

9 录制与回放

  • 流媒体服务器(SRS/ZL)支持录制输出到本地或对象存储(分段TS → 合并/转码为MP4)。
  • 录制策略:按房间/按时间切分;长回放可自动转码为 MP4 存储到 OSS 并生成播放页。

10 部署与运维(要点)

  • 分离部署:把流媒体服务器放在高带宽机器/专线,应用层与数据库放其他节点。
  • CDN 分发 HLS/TS 以降低 origin 带宽。
  • 自动扩缩容:应用层用容器化,水平扩展;流媒体层按 region/推流压力扩展。
  • 监控:监控流数、推流失败率、CPU、带宽、延迟、活跃观众数。报警阈值例如:流媒体 CPU>80%、推流失败率>1%。
  • 日志:集中化流日志(推流/断流/错误)便于问题定位。

11 性能与扩展策略

  • 读多写少场景(大量观众)把流分发交给 CDN。
  • 聊天系统做分区(多台 WS 服务器、Redis 集群做 pub/sub),使用一致性哈希分配房间到 WS 节点。
  • 数据库主从分离、读写分离;热点数据(房间在线人数)放 Redis。

12 开发路线图(Sprint 分解)

MVP(2-4 周):

  • 用户注册/登录、主播创建房间、生成 stream_key
  • 简单 RTMP 推流鉴权(on_publish)、SRS/nginx-rtmp 集成
  • Web 播放页(hls.js / flv.js) + play token
  • 基础 WebSocket 弹幕(单节点)

V1(1-2 月):

  • 礼物系统 + 支付接入
  • 录制与回放、回放播放页
  • 多机房部署 & CDN 集成
  • 监控告警与日志体系

V2(2-4 月):

  • 低延迟(WebRTC/RTC)与连麦功能
  • IM 服务升级(支持百万级在线)
  • 私有化部署脚本(Docker Compose / Helm charts)
  • 安全加固、风控策略

13 常见陷阱与建议

  • 不要把流媒体和应用放同一台低带宽机器上;带宽是第一瓶颈。
  • 先用短期 token 防盗链,再做更复杂策略(IP绑定/设备绑定)
  • 弹幕和礼物写库必须异步化,避免阻塞主流程。
  • 做自动化测试:使用 ffmpeg/ffplay 脚本做推流和拉流的集成测试。

14 参考与工具(自测)

  • ffmpeg(用于本地推流与转码测试)
  • flv.js / hls.js(浏览器播放)
  • SRS / ZLMediaKit / nginx-rtmp 文档
  • Docker images(srs、zlmediakit)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 概览 — 目标与定位
  • 2 技术选型(推荐)
  • 3 系统架构(分层)
  • 4 核心表设计(示例)
  • 5 关键流程与接口(示例)
  • 6 代码片段(简化示例)
    • 6.1 生成 stream_key(Laravel 风格)
    • 6.2 nginx-rtmp / SRS on_publish 验证(示例 PHP)
    • 6.3 生成播放短期 token(HMAC)
  • 7 弹幕与聊天室实现建议
  • 8 安全与鉴权要点
  • 9 录制与回放
  • 10 部署与运维(要点)
  • 11 性能与扩展策略
  • 12 开发路线图(Sprint 分解)
  • 13 常见陷阱与建议
  • 14 参考与工具(自测)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档