首页
下载
文档
问答社区
视频
捐赠
源代码
AI 助理
赞助商
CRMEB
Apipost
腾讯云
微擎
禅道
51Talk
商业产品
Swoole AI 智能文档翻译器
Swoole-Compiler PHP 代码加密器
CRMEB 新零售社交电商系统
登录
注册
全部
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
发表新帖
websocket不知道这样对不对呢
我想要达到的目的是开一个websocket,定时查询数据库,然后有符合条件的记录时,给client端push一个消息,会push两次,何解? {{{ <?php $ws = new swoole_websocket_server("0.0.0.0", 9503); $ws->on('WorkerStart', function($ws, $worker_id){ echo 'Server2 started, worker_id:' . $worker_id; // 定时器,每分钟一次 $ws->tick(2000, function() use ($ws){ $db = new swoole_mysql; $server = array( 'host' => '', 'port' => '', 'user' => '', 'password' => '', 'database' => '' ); $r = $db->connect($server, function($db, $result) use($ws){ if($result === false){ var_dump($db->connect_errno, $db->connect_error); die; } echo "connect to mysql server sucess\n"; $sql = 'select id, created, mailto, mailtitle, mailcontent from mail_notice_cron where type=1'; $db->query($sql, function(swoole_mysql $db, $r) use($ws){ global $s; if($r === false){ var_dump($db->error, $db->errno); }elseif ($r === true){ var_dump($db->affected_rows, $db->insert_id); } echo "count=" . count($r) . ", time=" . (microtime(true) - $s), "\n"; foreach($r as $cron){ // 给不同的端发消息 $start_fd = 0; while(true){ $conn_list = $ws->connection_list($start_fd, 10); if($conn_list===false or count($conn_list) === 0) break; $start_fd = end($conn_list); foreach($conn_list as $fd){ $ws->push($fd, json_encode($cron)); echo '发消息给:' . $fd . ',消息内容:' . serialize($cron); } } $db->query("delete from mail_notice_cron where id=" . $cron['id'], function(swoole_mysql $db, $r){ }); } $db->close(); }); }); }); }); $ws->on('open', function ($ws, $request) { var_dump($request->fd, $request->get, $request->server); $ws->push($request->fd, "hello, welcome\n"); }); $ws->on('message', function ($ws, $frame) { echo "Message: {$frame->data}\n"; $ws->push($frame->fd, "server: {$frame->data}"); }); $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; }); $ws->start(); }}} 会输出 {{{ Server2 started, worker_id:0Server2 started, worker_id:1 var_dump($conn_list); // 也会打印两次 }}} 这是正常的吗?
发布于7年前 · 1 次浏览 · 来自
提问
龙
龙想凌。
我想要达到的目的是开一个websocket,定时查询数据库,然后有符合条件的记录时,给client端push一个消息,会push两次,何解? {{{ <?php $ws = new swoole_websocket_server("0.0.0.0", 9503); $ws->on('WorkerStart', function($ws, $worker_id){ echo 'Server2 started, worker_id:' . $worker_id; // 定时器,每分钟一次 $ws->tick(2000, function() use ($ws){ $db = new swoole_mysql; $server = array( 'host' => '', 'port' => '', 'user' => '', 'password' => '', 'database' => '' ); $r = $db->connect($server, function($db, $result) use($ws){ if($result === false){ var_dump($db->connect_errno, $db->connect_error); die; } echo "connect to mysql server sucess\n"; $sql = 'select id, created, mailto, mailtitle, mailcontent from mail_notice_cron where type=1'; $db->query($sql, function(swoole_mysql $db, $r) use($ws){ global $s; if($r === false){ var_dump($db->error, $db->errno); }elseif ($r === true){ var_dump($db->affected_rows, $db->insert_id); } echo "count=" . count($r) . ", time=" . (microtime(true) - $s), "\n"; foreach($r as $cron){ // 给不同的端发消息 $start_fd = 0; while(true){ $conn_list = $ws->connection_list($start_fd, 10); if($conn_list===false or count($conn_list) === 0) break; $start_fd = end($conn_list); foreach($conn_list as $fd){ $ws->push($fd, json_encode($cron)); echo '发消息给:' . $fd . ',消息内容:' . serialize($cron); } } $db->query("delete from mail_notice_cron where id=" . $cron['id'], function(swoole_mysql $db, $r){ }); } $db->close(); }); }); }); }); $ws->on('open', function ($ws, $request) { var_dump($request->fd, $request->get, $request->server); $ws->push($request->fd, "hello, welcome\n"); }); $ws->on('message', function ($ws, $frame) { echo "Message: {$frame->data}\n"; $ws->push($frame->fd, "server: {$frame->data}"); }); $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; }); $ws->start(); }}} 会输出 {{{ Server2 started, worker_id:0Server2 started, worker_id:1 var_dump($conn_list); // 也会打印两次 }}} 这是正常的吗?
赞
0
分享
收藏
提问
分享
讨论
建议
公告
开发框架
CodeGalaxy
评论
2017-12-25
g
ghostjialong1988
还有一个问题,client退出之后,connection_list的数量没有变化,这个要调用哪个函数?
赞
0
回复
2018-02-09
华
华
因为……你的机器是2核的吧,这样swoole会创建两个worker进程,worker start回调会调两次。 你可以使用worker_num来指定进程数量,也可以 在程序里通过worker_id来判定
赞
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一直是同一个。没用使用到多进程啊。