目标:用 PHP 构建一个支持 主播推流(RTMP)→ 流媒体转发(HLS/FLV/HTTP-FLV/可选WebRTC)→ 浏览器/移动端播放 的直播平台,具备房间管理、鉴权、弹幕/聊天室、礼物与支付、回放(录制)、基础监控。
适用场景:直播课堂、直播带货、社交直播、企业内网直播(私有化部署)。

-- 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);stream_key(存 rooms)
rtmp://STREAM_SERVER/live/{stream_key}
on_publish 回调到 PHP:PHP 验证 stream_key → 返回 2xx 允许推流 → 更新 rooms.is_live = 1,写入 streams 表 start_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 聊天/弹幕
function genStreamKey($userId) {
return bin2hex(random_bytes(16)) . '-' . $userId;
}// 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";
}function createPlayToken($roomId, $secret, $expire=300) {
$exp = time() + $expire;
$payload = $roomId . '|' . $exp;
$sig = hash_hmac('sha256', $payload, $secret);
return base64_encode($payload . '|' . $sig);
}MVP(2-4 周):
V1(1-2 月):
V2(2-4 月):
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。