首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websocket的聊天室问题
代码 websocket.php {{{ <?php $client = array();//存放所有客户端 $server = new swoole_websocket_server("0.0.0.0", 9501); $server->on('open', function (swoole_websocket_server $server, $request) { global $client; $client[$request->fd] = $request->fd;//链接的时候存储 }); $server->on('message', function (swoole_websocket_server $server, $frame) { global $client; $data = $frame->data; foreach ($client as $fd) {//当收到信息时,循环向所有的客户端发送这个数据 $server->push($fd, $data ); } var_dump($client);//服务端输出看看现在几个客户端 }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->start(); }}} 附上 html的代码 {{{ <!DOCTYPE html> <html> <head> <title></title> <meta charset="UTF-8"> <script type="text/javascript"> var exampleSocket = new WebSocket("ws://0.0.0.0:9501"); exampleSocket.onopen = function (event) { exampleSocket.send("亲爱的服务器!我连上你啦!"); }; exampleSocket.onmessage = function (event) { console.log(event.data); } </script> </head> <body> <input type="text" id="content"> <button onclick="exampleSocket.send( document.getElementById('content').value )">发送</button> </body> </html> }}} 我发现个问题 我的$client 是全局变量,可是并没有存储到所有的客户端fd,这是为什么呢? 顺便请问,swoole的回调函数只能使用一般的函数名或者匿名函数两种方法吗?能不能是对象的一个方法呢?(请举个例子)
发布于7年前 · 2 次浏览 · 来自
提问
锋
锋云
代码 websocket.php {{{ <?php $client = array();//存放所有客户端 $server = new swoole_websocket_server("0.0.0.0", 9501); $server->on('open', function (swoole_websocket_server $server, $request) { global $client; $client[$request->fd] = $request->fd;//链接的时候存储 }); $server->on('message', function (swoole_websocket_server $server, $frame) { global $client; $data = $frame->data; foreach ($client as $fd) {//当收到信息时,循环向所有的客户端发送这个数据 $server->push($fd, $data ); } var_dump($client);//服务端输出看看现在几个客户端 }); $server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n"; }); $server->start(); }}} 附上 html的代码 {{{ <!DOCTYPE html> <html> <head> <title></title> <meta charset="UTF-8"> <script type="text/javascript"> var exampleSocket = new WebSocket("ws://0.0.0.0:9501"); exampleSocket.onopen = function (event) { exampleSocket.send("亲爱的服务器!我连上你啦!"); }; exampleSocket.onmessage = function (event) { console.log(event.data); } </script> </head> <body> <input type="text" id="content"> <button onclick="exampleSocket.send( document.getElementById('content').value )">发送</button> </body> </html> }}} 我发现个问题 我的$client 是全局变量,可是并没有存储到所有的客户端fd,这是为什么呢? 顺便请问,swoole的回调函数只能使用一般的函数名或者匿名函数两种方法吗?能不能是对象的一个方法呢?(请举个例子)
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2016-12-24
老
老龐
因为swoole是多进程运行的,$client虽然是全局变量,但也仅仅是在当前进程内有效。请使用 $server->connections 迭代器来获取所有客户端连接。
赞
0
回复
微信公众号
热门内容
暂无回复的问答
- CodeGalaxy K3s 轻量集群节点之间如何实现负载均衡
- 关于openssl CURL WARNING swSSL_connect: SSL_connect(fd=69) failed. Error: error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small[1|394]
- 多个模型如何进行事务异常回退?
- websocket开启wss报错
- 协程tcp服务器如何使用多进程?recv()方法接收信息,打印出来的pid一直是同一个。没用使用到多进程啊。