php实现在线直播
PHP 实现在线直播的基本方法
在线直播功能通常需要结合流媒体服务器(如Nginx-RTMP、SRS、Red5)和前端播放器实现。PHP主要用于处理业务逻辑,如用户验证、直播列表管理等,流媒体传输由专业服务器完成。
搭建流媒体服务器
推荐使用Nginx搭配RTMP模块作为直播服务器:
-
编译Nginx时添加
nginx-rtmp-module模块 -
配置nginx.conf添加RTMP服务块:
rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; allow publish 127.0.0.1; allow play all; } } }
推流端实现
使用OBS或FFmpeg进行推流测试:

ffmpeg -re -i input.mp4 -c copy -f flv rtmp://服务器IP/live/流名称
PHP生成唯一流名称示例:
$stream_key = uniqid('stream_');
$rtmp_url = "rtmp://your_server/live/{$stream_key}";
播放器集成
前端使用hls.js或flv.js播放直播流:
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<video id="video" controls></video>
<script>
if(Hls.isSupported()) {
const video = document.getElementById('video');
const hls = new Hls();
hls.loadSource('http://服务器IP/live/流名称.m3u8');
hls.attachMedia(video);
}
</script>
PHP业务逻辑处理
-
直播创建接口:

function createLiveStream($user_id) { $stream_key = bin2hex(random_bytes(8)); $db->insert('live_streams', [ 'user_id' => $user_id, 'stream_key' => $stream_key, 'status' => 'created' ]); return ['rtmp_url' => "rtmp://yourserver/live/{$stream_key}"]; } -
直播状态回调处理:
// 接收RTMP服务器的webhook回调 $data = json_decode(file_get_contents('php://input'), true); if($data['event'] == 'publish_done') { $db->update('live_streams', ['status' => 'ended'], ['stream_key' => $data['stream']] ); }
安全防护措施
-
推流鉴权:
application live { on_publish http://your_php_server/auth_stream; } -
PHP鉴权接口:
if($_GET['name'] != 'valid_stream' || $_GET['pass'] != 'secret') { header('HTTP/1.1 403 Forbidden'); exit; }
性能优化建议
- 使用CDN分发直播流
- 配置多级缓存策略
- 对HLS分片启用HTTP缓存头
- 数据库读写分离处理直播状态数据
注意事项
- RTMP协议默认使用1935端口,确保防火墙放行
- HLS协议有10秒左右的延迟
- 高并发场景建议使用专业云直播服务(如阿里云直播、腾讯云直播)
- 移动端需要单独处理自适应码率
完整实现需要配合前端开发、服务器运维等多方面工作,建议从简单的测试环境开始逐步完善功能。






