利用Swoole实现PHP+websocket直播,即使通讯代码,及linux下swoole安装基本配置
swoole安装基本配置
php安装swoole
1. 下载swoole安装

- wget http://pecl.php.net/get/swoole-1.9.1.tgz
- tar -zxvf swoole-1.9.1.tgz
- cd swoole-1.9.1
- phpize
- ./configure
- make
- make install

2. 在php.ini添加swoole.so
- extension=swoole.so
php -m查看是否安装成功
环境依赖
- 仅支持Linux,FreeBSD,MacOS,3类操作系统
- Linux内核版本2.3.32以上
- PHP5.3.10以上版本
- gcc4.4以上版本或者clang
- cmake2.4+,编译为libswoole.so作为C/C++库时需要使用cmake
PHP版本依赖
- swoole仅支持PHP5.3.10或更高版本,建议使用PHP5.4+
- swoole不依赖php的stream、sockets、pcntl、posix、sysvmsg等扩展。PHP只需安装最基本的扩展即可
PHP直播代码
1.start.php 使用时需要开启,服务器输入(php start.php)

- <?php
- //php在线直播示例代码
- //使用PHPCLI模式运行
- //命令:php start.php
- //设置路径
- define('_ROOT_', dirname(__FILE__));
- require_once _ROOT_.'/function.php';
- //监听地址和端口
- $server = new swoole_websocket_server("0.0.0.0(这里就是四个0,不要改)", 8888);
- //服务端接收连接事件
- $server->on('open', function (swoole_websocket_server $server, $request) {
- if(!file_exists(_ROOT_.'/client/'.$request->fd.'.client')){
- @file_put_contents(_ROOT_.'/client/'.$request->fd.'.client',$request->fd);
- }
- });
- //服务端接收信息事件
- $server->on('message', function (swoole_websocket_server $server, $frame) {
- foreach(notice(_ROOT_.'/client/') as $v){
- $server->push($v,$frame->data);
- }
- });
- //服务端接收关闭事件
- $server->on('close', function ($ser, $fd) {
- @unlink(_ROOT_.'/client/'.$fd.'.client');
- });
- //服务开启
- $server->start();

2.index.html 直播页面,访问该页面观看直播

- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title>在线直播界面</title>
- </head>
- <body>
- <img id="receiver" style='width:640px;height:480px'/>
- <script type="text/javascript" charset="utf-8">
- var ws = new WebSocket("ws://改成自己服务器ip:8888");
- var image = document.getElementById('receiver');
- ws.onopen = function(){
- }
- ws.onmessage = function(data)
- {
- image.src=data.data;
- }
- </script>
- </body>
- </html>

3.rec.html主播录制页面,访问该页面进行直播录制

- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title>主播录制界面</title>
- </head>
- <body>
- <video id="video" autoplay="" style='width:640px;height:480px'></video>
- <canvas id="output" style="display:none"></canvas>
- <script type="text/javascript" charset="utf-8">
- var ws = new WebSocket("ws://自己服务器ip:8888");
- var back = document.getElementById('output');
- var backcontext = back.getContext('2d');
- var video = document.getElementById("video");
- var success = function(stream){
- video.src = window.URL.createObjectURL(stream);
- }
- ws.onopen = function(){
- draw();
- }
- var draw = function(){
- try{
- backcontext.drawImage(video,0,0, back.width, back.height);
- }catch(e){
- if (e.name == "NS_ERROR_NOT_AVAILABLE") {
- return setTimeout(draw, 100);
- } else {
- throw e;
- }
- }
- if(video.src){
- ws.send(back.toDataURL("image/jpeg", 0.5));
- }
- setTimeout(draw, 100);
- }
- navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
- navigator.mozGetUserMedia || navigator.msGetUserMedia;
- navigator.getUserMedia({video:true, audio:false}, success, console.log);
- </script>
- </body>
- </html>

4.function.php 统计数据页面

- <?php
- //统计在线人数
- function clearDir($dir)
- {
- $n = 0;
- if ($dh = opendir($dir))
- {
- while (($file = readdir($dh)) !== false)
- {
- if ($file == '.' or $file == '..')
- {
- continue;
- }
- if (is_file($dir . $file)) {
- $n++;
- }
- }
- }
- closedir($dh);
- return $n;
- }
- //通知在线的人
- function notice($dir){
- if ($dh = opendir($dir))
- {
- while (($file = readdir($dh)) !== false)
- {
- if ($file == '.' or $file == '..')
- {
- continue;
- }
- if (is_file($dir . $file)) {
- $array[]=file_get_contents($dir.$file);
- }
- }
- }
- closedir($dh);
- return $array;
- }

5.在同级目录php
PHP 即使通讯
1.socket.php 一样,使用时需要开启
- 复制代码
- <?php
- //创建websocket服务器对象,监听0.0.0.0:9502端口
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
- //监听WebSocket连接打开事件
- $ws->on('open', function ($ws, $request) {
- $fd[] = $request->fd;
- $GLOBALS['fd'][] = $fd;
- //$ws->push($request->fd, "hello, welcome\n");
- });
- //监听WebSocket消息事件
- $ws->on('message', function ($ws, $frame) {
- $msg = 'from'.$frame->fd.":{$frame->data}\n";
- //var_dump($GLOBALS['fd']);
- //exit;
- foreach($GLOBALS['fd'] as $aa){
- foreach($aa as $i){
- $ws->push($i,$msg);
- }
- }
- // $ws->push($frame->fd, "server: {$frame->data}");
- // $ws->push($frame->fd, "server: {$frame->data}");
- });
- //监听WebSocket连接关闭事件
- $ws->on('close', function ($ws, $fd) {
- echo "client-{$fd} is closed\n";
- });
- $ws->start();
2.socket.html聊天页面

- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <div id="msg"></div>
- <input type="text" id="text">
- <input type="submit" value="发送数据" onclick="song()">
- </body>
- <script>
- var msg = document.getElementById("msg");
- var wsServer = 'ws://60.205.208.176:9502';
- //调用websocket对象建立连接:
- //参数:ws/wss(加密)://ip:port (字符串)
- var websocket = new WebSocket(wsServer);
- //onopen监听连接打开
- websocket.onopen = function (evt) {
- //websocket.readyState 属性:
- /*
- CONNECTING 0 The connection is not yet open.
- OPEN 1 The connection is open and ready to communicate.
- CLOSING 2 The connection is in the process of closing.
- CLOSED 3 The connection is closed or couldn't be opened.
- */
- msg.innerHTML = websocket.readyState;
- };
- function song(){
- var text = document.getElementById('text').value;
- document.getElementById('text').value = '';
- //向服务器发送数据
- websocket.send(text);
- }
- //监听连接关闭
- // websocket.onclose = function (evt) {
- // console.log("Disconnected");
- // };
- //onmessage 监听服务器数据推送
- websocket.onmessage = function (evt) {
- msg.innerHTML += evt.data +'<br>';
- // console.log('Retrieved data from server: ' + evt.data);
- };
- //监听连接错误信息
- // websocket.onerror = function (evt, e) {
- // console.log('Error occured: ' + evt.data);
- // };
- </script>
- </html>
利用Swoole实现PHP+websocket直播,即使通讯代码,及linux下swoole安装基本配置的更多相关文章
- LINUX环境下SVN安装与配置(利用钩子同步开发环境与测试环境)
安装采用YUM一键安装: 1.环境Centos 6.6 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata svnserve ...
- 利用Swoole实现PHP+websocket直播,即使通讯
websocket Websocket只是一个网络通信协议,就像 http.ftp等都是网络通信的协议一样:相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议: WebS ...
- Linux下swoole的安装配置
前几天搭建swoole环境,在安装php的swoole扩展时不知道什么原因,提示成功,但是使用的时候不能加载,最后决定重新安装php试试,顺便记录了php的安装过程 wget http://cn2.p ...
- linux下swoole的安装
//官方推荐的安装方式1:下载压缩包 wget https://github.com/swoole/swoole-src/archive/swoole-1.8.4-stable.zip 2:解压缩 u ...
- Swoole跟thinkphp5结合开发WebSocket在线聊天通讯系统
ThinkPHP使用Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展* tp5的项目根目录下执行composer命令安装think- ...
- JavaEE7 HTML5利用WebSocket实现即时通讯
HTML5给Web浏览器带来了全双工TCP连接websocket标准服务器的能力. 换句话说,浏览器能够与服务器建立连接,通过已建立的通信信道来发送和接收数据而不需要由HTTP协议引入额外其他的开销来 ...
- Android WebSocket实现即时通讯功能
最近做这个功能,分享一下.即时通讯(Instant Messaging)最重要的毫无疑问就是即时,不能有明显的延迟,要实现IM的功能其实并不难,目前有很多第三方,比如极光的JMessage,都比较容易 ...
- 实现websocket 主动消息推送,用laravel+Swoole
近来有个需求:想实现一个可以主动触发消息推送的功能,这个可以实现向模板消息那个,给予所有成员发送自定义消息,而不需要通过客户端发送消息,服务端上message中监听传送的消息进行做相对于的业务逻辑. ...
- php基于swoole扩展的WebSocket
php的swoole的扩展可以实现WebSocket通信,方法如下 1.php添加swoole扩展: 一:两种安装方式:1>编译安装:1>wget http://pecl.php.net/ ...
随机推荐
- mixin 在传参中可以出现 参数 在类内部可以定义 作用域
mixin 在传参中可以出现 参数 在类内部可以定义
- java集合的部分接口
接口 Collection<E> public interface Collection<E>extends Iterable<E> Collection 层次结构 ...
- JS基础知识简介
使用js的三种方式 1.HTML标签内嵌js <button onclick="javascript:alert(真点啊)">有本事点我</button> ...
- 洛谷 P4819 [中山市选]杀人游戏
洛谷 题目就是让我们在DAG中找到一些点,覆盖所有点. 因为是DAG,可以想到tarjan缩一下点.假设我们需要找x个点,那么答案就是(n-x)/n. 我们怎么选点呢? 敏锐的我们很快就能想到,直接选 ...
- SpringMVC 课纲
SpringMVC 课纲 第一章 SpringMVC 架构 一个简单的 web 项目,校验器 SpringMVC 组件及相互关系 第二章 数据绑定 form标签库 第三章 Converter 和 Fo ...
- centos7 yum安装MongoDB
centos7 yum安装MongoDB 原文博客地址http://xgs888.top/post/view?id=64 centos7 yum安装mongodb: 1:创建仓库 vi /etc/ ...
- 006-搭建框架-实现AOP机制【三】AOP技术
2.3.spring+aspectj Spring在集成了aspectj后,同时也保留了以上的切面与代理的配置方式. 将Spring与aspectj集成与直接使用aspectj不同,不需要定义Aspe ...
- 基于twemproxy的redis集群部署
一.系统及软件版本 操作系统:CentOS Linux release 7.3.1611 (Core) 内核版本:3.10.0-514.el7.x86_64 redis版本:3.2.8 twempro ...
- 常见Web源码泄露总结
来自:http://www.hacksec.cn/Penetration-test/474.html 摘要 背景 本文主要是记录一下常见的源码泄漏问题,这些经常在web渗透测试以及CTF中出现. .h ...
- 用matlab将nc数据读出来,写成二进制文件,然后用grads画图
clear,clc nt=735;ny=73; %2.5*2.5格点的nx=144; %2.5*2.5格点的f=netcdf('air.mon.mean.nc','nowrite');tt ...