PHP与SRS无缝对接实战指南:从WebRTC到直播流的全链路技术解析

目录导读
- SRS是什么?为什么PHP开发者需要关注它?
- PHP与SRS的三种主流对接方式(HTTP API / WebSocket / 回调鉴权)
- 实战场景一:PHP生成SRS推流地址与签名鉴权
- 实战场景二:PHP通过SRS HTTP API动态管理直播间
- 实战场景三:PHP处理SRS事件回调(上线/断流/录制通知)
- 性能优化与安全坑位(并发、Token过期、防盗链)
- 高频问答(FAQ)与故障排查清单
SRS是什么?为什么PHP开发者需要关注它?
SRS(Simple Realtime Server)是一款开源的、高性能的流媒体服务器,支持RTMP、HLS、WebRTC、SRT等协议,它常被用作直播、连麦、低延迟监控等场景的底层分发核心,PHP作为服务端脚本语言,通常负责业务逻辑(用户认证、房间管理、数据统计),而SRS负责媒体流处理,两者对接的核心目标就是:让PHP能控制SRS创建/关闭流、生成带鉴权的推拉流地址,并实时感知流状态变化。
PHP与SRS的三种主流对接方式
- HTTP API(最常用):SRS提供了RESTful风格的HTTP接口(如
/api/v1/streams或/api/v1/clients),PHP通过curl发起GET/POST请求获取流列表、踢人、关闭流等,这是最稳健的对接方式,适合管理操作。 - WebSocket(实时通信):SRS支持WebSocket(如
ws://ip:1985/ws),PHP可通过Swoole或Workerman长连接监听流事件,适合做实时在线人数统计或热更新。 - HTTP回调(事件驱动):SRS在推流开始、结束、录制完成时,向PHP配置的回调URL推送JSON数据,PHP端只需暴露一个接收接口即可,这是最常用的“被动”对接方式。
关键点:三种方式可组合使用,用HTTP API做后台管理,用回调做自动启播记录。
实战场景一:PHP生成SRS推流地址与签名鉴权
SRS本身支持URL签名防盗链(?token=xxx),PHP动态生成带过期时间的鉴权串:
// 假设secret_key为SRS配置的密钥
$secret = 'my_srs_secret';
$streamId = 'live/room_' . $roomId;
$expire = time() + 3600;
$sign = md5($streamId . $expire . $secret);
$rtmpUrl = "rtmp://srs.domain.com:1935/{$streamId}?sign={$sign}&expire={$expire}";
SRS侧在 vhost 中开启 http_remux 和 token_auth 校验,这样即使地址泄露,过期后自动失效,PHP只需要保证每次推流/拉流时重新生成签名。
实战场景二:PHP通过SRS HTTP API动态管理直播间
强制断流、查询正在直播的流列表。
$apiUrl = "http://127.0.0.1:1985/api/v1/streams";
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$streams = json_decode($response, true);
// 找到指定流ID,然后删除
foreach ($streams['streams'] as $stream) {
if ($stream['name'] == $streamId) {
$deleteUrl = "http://127.0.0.1:1985/api/v1/streams/" . $stream['id'];
// 发起DELETE请求即可
}
}
注意:SRS API接口需要开启 http_api 配置,且通过内网IP访问更安全。
实战场景三:PHP处理SRS事件回调(上线/断流/录制通知)
在SRS配置文件中加入:
vhost __defaultVhost__ {
on_publish http://php-server/callback/publish.php;
on_unpublish http://php-server/callback/unpublish.php;
}
PHP回调接收JSON:
$data = json_decode(file_get_contents('php://input'), true);
$action = $data['action']; // publish 或 unpublish
$stream = $data['stream'];
if ($action == 'publish') {
// 写数据库:用户开始直播
} elseif ($action == 'unpublish') {
// 写数据库:直播结束,计算时长
}
注意:回调接口必须快速返回 HTTP 200,否则SRS会重试导致阻塞。
性能优化与安全坑位
- 并发控制:PHP写数据库可能成为瓶颈,建议用Redis异步队列处理回调。
- Token泄露风险:签名不要用MD5加盐,改用HMAC-SHA256,且时间戳误差不超过600秒。
- 禁止公网直连SRS API:只允许PHP所在内网访问,或加token白名单。
- 超时处理:SRS回调等待PHP响应超时(默认5秒),PHP端逻辑要精简,避免查询慢SQL。
高频问答(FAQ)与故障排查清单
Q1:PHP调用SRS API返回401?
检查SRS http_api 是否启用,且API端口只能本地访问。
Q2:推流正常,但PHP回调收不到?
先确认SRS日志是否有callback错误,检查PHP回调URL是否公网可达,加上debug日志。
Q3:SRS签名防盗链校验失败?
确认sign算法与SRS配置的key一致,注意streamId必须和实际推流路径完全一样,不能加多余斜杠。
Q4:SRS推流后PHP生成地址是HLS还是RTMP?
如果拉流用HLS,PHP应生成 http://domain/live/xxx.m3u8?token=...,但这要求SRS启用http_remux并配置hls。
Q5:如何实现秒级断流自动通知?
使用on_unpublish回调,配合PHP Worker定时检查,若超1分钟未收到心跳则标记异常。
通过以上全链路梳理,PHP与SRS的对接已经覆盖了从地址生成、事件驱动到后台管理的完整闭环,掌握这五项技能,即可构建企业级直播系统,建议在实际项目中逐步从简单回调入手,再叠加API管理,最后优化并发与安全策略。