微信小程序+php+swoole极速实现群聊
来源:互联网 发布:淘宝发布宝贝数量 编辑:程序博客网 时间:2024/06/05 02:38
最近突然想做一个php实时通讯
我就点开了这个
WebSocket
我看了看官网的demo,觉得看起来很简单嘛,
<?php//官网demo$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客户端id});$server->on('message', function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $server->push($frame->fd, "this is server");//$frame->fd 是客户端id,$frame->data是客户端发送的数据 //服务端向客户端发送数据是用 $server->push( '客户端id' , '内容')});$server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n";});$server->start();
我就是喜欢这种简单易懂的demo ,每行代码意思一看就明白
接下来XML页面<view> <view class="sendmessage"> <input id="message" bindinput="inputMessage" placeholder="请输入聊天内容"></input> <button bindtap="sendMessage">发送</button> </view></view> <view><scroll-view scroll-y="true" class="history"><view wx:for="{{message}}"> <block wx:if="{{item.class == 1}}"> <view class="user">{{item.name}}说:{{item.msg}}</view> </block> <block wx:else> <view class="service">{{item.name}}说:{{item.msg}}</view> </block></view></scroll-view></view>
最后命令行运行php文件,之后浏览器打开html文件,F12打开调试界面看console,ok , 没有问题
这个时候我突然想到一个事情,因为我做多进程的那个教程里,在主进程中会将所有的子进程的句柄存起来,以后进行进程间通讯用。
那么 我将所有的客户端的链接存起来存成数组,每当一个客户端发送消息时,我就遍历这个客户端数组,将消息群发一遍,不久实现了聊天室了吗?
然后就,服务端代码成了这个样子
<?php$map = array();//客户端集合$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) { global $map;//客户端集合 $map[$request->fd] = $request->fd;//首次连上时存起来});$server->on('message', function (swoole_websocket_server $server, $frame) { global $map;//客户端集合 $data = $frame->data; foreach($map as $fd){ $server->push($fd , $data);//循环广播 }});$server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n";});$server->start();
哈哈 , 我觉得这样就大功告成了,结果发现自己是 图样图森破大家可以自己试试,运行php后 , 浏览器打开两个页面,看看console.log的内容是什么
运行良好,可是并没有实现我们说的那种聊天效果。
找找原因吧。
我第一反映看看$map里面是什么,就输出看看,结果发现这个map里面只有一个元素。
唉,不对啊,我这是全局变量,难道不应该是有几个客户端链接,就有几个元素吗?
这是怎么回事啊,竟然没有保存到所有客户端id?
到了这一步,我解决不了map变量的这个问题了,然后我就想看看那个fd是什么东西,
老规矩 var_dump输出 , 发现fd就是 int类型的数字,并且是自增的
这好办了,不就是数字嘛
于是呼,我就这样做
变量存不了,我搞不定,我存文本里嘛。
最终版 websocket.php
<?php$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) { file_put_contents( __DIR__ .'/log.txt' , $request->fd);});$server->on('message', function (swoole_websocket_server $server, $frame) { global $client; $data = $frame->data; $fd=$frame->fd; $m = file_get_contents( __DIR__ .'/log.txt'); for ($i=1 ; $i<= $m ; $i++) { echo PHP_EOL . ' i is ' . $i . ' data is '.$data . ' m = ' . $m; if($i->$fd){ $arr=json_decode($data,true); $arr['
name
']="我"; $arr['class']=1; $data=json_endode($arr); } $server->push($i, $data ); }});$server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n";});$server->start();最最重要的是我们的小程序客户端的js代码socket.js//获取应用实例var app = getApp()var socketOpen="false"var inputMessage=""var i=0var msgInfo={}Page({ data: { message:"" }, //获取输入框信息 inputMessage: function(e) { inputMessage=e.detail.value }, //点击事件 sendMessage:function(){ if (socketOpen) { var nickname = wx.getStorageSync('nickname') if (nickname=="") { nickname="游客" } var data1='{"name":"'+nickname+'","msg":"'+inputMessage+'"}' wx.sendSocketMessage({ data:data1 }) } }, //页面加载事件 onLoad: function () { var that=this wx.connectSocket({ url: 'ws://192.168.1.181:9502/swoole/ws_server.php' }) wx.onSocketOpen(function(res) { socketOpen="true" }) wx.onSocketMessage(function(res) { i=i+1 //console.log(res) var re=JSON.parse(res.data) msgInfo[i]=re console.log(msgInfo) if(res.data){ that.setData({ message:msgInfo }) } }) }})
再次打开开发者工具,多个页面进行输入观察,ok,可以了。
当然,作为聊天室,我这写的也过于简陋了,界面大家自己可以写的好看一些(因为我懒的写界面)还有,每次的发送聊天的记录,应该存起来,这样,如果有新的连接连过来的时候,先把以前的聊天记录发过去,这样,我想体验更好一些
然后,大家可以愉快的聊天了。哈哈
- 微信小程序+php+swoole极速实现群聊
- 利用Swoole实现PHP+websocket 聊天室
- 利用Swoole实现PHP+websocket 聊天室
- 利用Swoole实现PHP+websocket 聊天室
- [李景山php] swoole之 UDP服务器实现
- 利用Swoole实现PHP+websocket 聊天室
- 利用Swoole实现PHP+websocket 聊天室
- PHP--swoole
- 【Swoole】当SWOOLE遇上PHP
- 【Swoole】当SWOOLE遇上PHP
- 基于swoole扩展实现真正的PHP数据库连接池
- 基于swoole扩展实现真正的PHP数据库连接池
- PHP swoole实现过10分钟 执行任务
- PHP+swoole实现简单多人在线聊天群发
- 使用php的swoole扩展实现数据实时更新(上)
- 使用php的swoole扩展实现数据实时更新(下)
- PHP使用swoole来实现实时异步任务队列
- PHP操作swoole来实现实时异步任务队列
- 01分数规划三类型总结
- 米洛个人修炼术:注意这三方面,天天都早起
- [题解] 合并果子 三种方法
- Android通知栏沉浸式模式
- 虚拟中的多态与现实中多态
- 微信小程序+php+swoole极速实现群聊
- 如何选择类型
- Calculus on Computational Graphs: Backpropagation(计算图表的微积分:反向传播)
- 周有光先生的生平影集
- iOS应用开发基础(二)基础知识
- 算法(1)--五种常见的算法思想简述
- LWIP手记【A】PUBF-1
- 3D射线拾取算法揭秘
- 实现一个容器视图控制器(上)