直播功能的核心是音视频流的传输与分发,PHP在其中主要负责业务逻辑处理,流传输则依赖专业的流媒体服务器。

直播功能核心架构
完整的直播链路包含三个核心部分:
- 推流端:主播使用的设备端,比如OBS、手机直播APP,负责采集音视频数据并推送到流媒体服务器
- 流媒体服务器:接收推流数据,进行转码、分发,支持RTMP、HLS等协议,常见的有Nginx-RTMP、SRS等
- 拉流端:观众使用的播放端,从流媒体服务器拉取音视频流进行播放
PHP的作用主要体现在业务层:比如主播开播前的权限校验、直播房间的创建与状态更新、观众进入直播间的鉴权、直播回放文件的生成与存储管理等,不会直接参与音视频流的传输处理。
流媒体服务器搭建(Nginx-RTMP为例)
首先需要搭建支持RTMP协议的流媒体服务器,这里以Nginx添加RTMP模块为例,步骤如下:
1. 安装Nginx与RTMP模块
如果是Ubuntu系统,可以通过以下命令安装:
# 安装编译依赖 sudo apt update sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev # 下载Nginx源码和RTMP模块源码 wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz git clone https://github.com/arut/nginx-rtmp-module.git # 编译安装 cd nginx-1.24.0 ./configure --add-module=../nginx-rtmp-module --with-http_ssl_module make sudo make install
2. 配置RTMP服务
修改Nginx配置文件(默认路径/usr/local/nginx/conf/nginx.conf),添加RTMP配置:
rtmp {
server {
listen 1935; # RTMP默认端口
chunk_size 4096;
application live {
live on; # 开启直播模式
# 可选:设置推流鉴权,调用PHP接口校验
on_publish http://127.0.0.1/live/auth_publish.php;
# 可选:拉流鉴权
on_play http://127.0.0.1/live/auth_play.php;
}
application hls {
live on;
hls on; # 开启HLS协议
hls_path /tmp/hls; # HLS切片文件存储路径
hls_fragment 5s; # 每个切片时长
}
}
}配置完成后重启Nginx使配置生效:sudo /usr/local/nginx/sbin/nginx -s reload
推流实现方式
推流端不需要PHP参与,主播可以使用OBS等工具直接推流到流媒体服务器,推流地址格式为:
- RTMP协议:
rtmp://服务器IP/live/房间号 - HLS协议:
rtmp://服务器IP/hls/房间号
如果需要做推流鉴权,可以通过PHP接口实现,比如上面配置的on_publish回调,PHP处理逻辑如下:
<?php
// auth_publish.php 推流鉴权示例
// Nginx-RTMP会传递参数:app、name、addr等,name就是房间号
$roomId = $_POST['name'] ?? '';
$streamKey = $_POST['key'] ?? ''; // 可以在推流地址后面加?key=xxx传递密钥
// 校验房间是否存在、流密钥是否正确
// 这里简化为示例,实际需要从数据库查询校验
$validKeys = ['test_key_123'];
if (in_array($streamKey, $validKeys)) {
// 鉴权通过,更新房间状态为直播中
// 实际项目中可以操作数据库更新live_status字段
file_put_contents('/tmp/live_status.log', "room {$roomId} start live\n", FILE_APPEND);
header('HTTP/1.0 200 OK');
echo 'ok';
} else {
// 鉴权失败,返回403
header('HTTP/1.0 403 Forbidden');
echo 'auth failed';
}拉流实现方式
观众端拉流根据协议不同,地址格式也不同:
| 协议类型 | 拉流地址格式 | 适用场景 |
|---|---|---|
| RTMP | rtmp://服务器IP/live/房间号 | 低延迟场景,比如PC端直播 |
| HLS | http://服务器IP/hls/房间号.m3u8 | 移动端、网页端,兼容性好 |
| FLV | http://服务器IP/live/房间号.flv | 低延迟网页播放 |
网页端拉流可以使用video.js等播放器,示例代码:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>直播播放</title>
<link href="https://vjs.zencdn.net/7.20.3/video-js.css" rel="stylesheet" />
</head>
<body>
<video id="livePlayer" class="video-js vjs-default-skin" controls preload="auto" width="800" height="450">
<source src="http://127.0.0.1/hls/1001.m3u8" type="application/x-mpegURL">
</video>
<script src="https://vjs.zencdn.net/7.20.3/video.min.js"></script>
<script>
var player = videojs('livePlayer');
player.play();
</script>
</body>
</html>拉流端的鉴权同样可以通过PHP接口实现,在on_play回调中校验观众权限,逻辑和推流鉴权类似,校验通过返回200,否则返回403即可。
PHP常见的直播业务功能
除了鉴权之外,PHP还可以实现以下直播相关功能:
- 直播房间管理:创建房间、查询房间列表、修改房间信息
- 直播状态同步:推流开始/结束时更新数据库状态,通知前端房间状态变化
- 直播回放生成:流媒体服务器切片存储后,PHP可以将切片文件转存到对象存储,生成回放链接
- 直播数据统计:统计观看人数、直播时长、观众地域分布等数据
注意:PHP不适合直接处理高并发的音视频流传输,所有流相关的处理都交给流媒体服务器,PHP只负责上层的业务逻辑,这样才能保证直播服务的稳定性。