workerman/gateway-worker从3.0.0版本升级到3.0.9出现这个问题

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 102 次浏览 • 2019-06-27 12:32 • 来自相关话题

如何保存GatewayWorker实时检测硬件在线状态

提问边玩边玩 回复了问题 • 2 人关注 • 1 个回复 • 100 次浏览 • 2019-06-27 09:36 • 来自相关话题

在GatewayWoker使用tcp协议,在onMessage里怎么调用外部的http服务接口,实现http请求,有知道的么

提问shasha 回复了问题 • 3 人关注 • 3 个回复 • 267 次浏览 • 2019-06-26 14:35 • 来自相关话题

phpsocketIO 有没有设计分布式 没发现这块得文档

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 76 次浏览 • 2019-06-26 14:33 • 来自相关话题

workerman多个进程下如何得知某个connetion对象在几号进程?

提问frodox 回复了问题 • 2 人关注 • 2 个回复 • 100 次浏览 • 2019-06-26 12:49 • 来自相关话题

phpsocket.io 推送延迟

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 77 次浏览 • 2019-06-26 09:42 • 来自相关话题

为什么我的任务500条循环去执行work 设置了32个进程 32个进程同时跑 然后工作一半id到250多就停了

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 99 次浏览 • 2019-06-25 15:39 • 来自相关话题

GatewayWorker在使用护卫神做PHP服务器是报错,GatewayWorker支持的PHP最高版本是多少?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 92 次浏览 • 2019-06-25 15:32 • 来自相关话题

客户端向服务器发送消息报错

提问zslzxc 回复了问题 • 3 人关注 • 2 个回复 • 235 次浏览 • 2019-06-25 15:22 • 来自相关话题

GlobalData分布式变量共享组件不能外网访问吗?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 83 次浏览 • 2019-06-24 20:07 • 来自相关话题

GatewayWorker最大连接数1024

回复

提问yunwalker 回复了问题 • 1 人关注 • 2 个回复 • 117 次浏览 • 2019-06-24 18:16 • 来自相关话题

突然发现gatewayworker报错,但是不知道是什么错是框架内部的错误吗

提问blogdaren 回复了问题 • 2 人关注 • 2 个回复 • 74 次浏览 • 2019-06-24 16:08 • 来自相关话题

小白询问服务器开启gatawaywork服务时报错问题

提问walkor 回复了问题 • 2 人关注 • 6 个回复 • 133 次浏览 • 2019-06-24 14:15 • 来自相关话题

循环执行异步请求 出现 have already been called

回复

提问咸丰年代的奶酪 回复了问题 • 1 人关注 • 1 个回复 • 70 次浏览 • 2019-06-24 11:22 • 来自相关话题

Workman 可以搭建MQTT服务端么?好像文档介绍的都是客户端啊。

提问taozywu 回复了问题 • 3 人关注 • 2 个回复 • 126 次浏览 • 2019-06-24 10:22 • 来自相关话题

请问workerman-thrift-rpc如何启动多个服务?

提问taozywu 回复了问题 • 3 人关注 • 2 个回复 • 158 次浏览 • 2019-06-24 10:19 • 来自相关话题

希望能在Gateway类里面增加一个函数

建议walkor 回复了问题 • 2 人关注 • 1 个回复 • 110 次浏览 • 2019-06-23 10:23 • 来自相关话题

Json RPC如何做鉴权功能呢

提问blogdaren 回复了问题 • 2 人关注 • 1 个回复 • 105 次浏览 • 2019-06-22 23:34 • 来自相关话题

gatewayworker连接本地(localhost)没问题。当连接远程数据库时,就连接不上,也没有提示什么的。是怎么回事?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 92 次浏览 • 2019-06-21 14:57 • 来自相关话题

GatewayWorker定时器为什么执行了del却没有生效

提问zk33311 发表了文章 • 9 个评论 • 114 次浏览 • 2019-06-21 14:49 • 来自相关话题

请教各位大神一个问题   我用GatewayWorker做了一个websocket定时向客户端发送数据的功能,通过利用定时器定时从某服务器获取数据,并发送给客户端。   且客户端可以切换发送数据的内容,每次切换回 ...查看全部
请教各位大神一个问题
 
我用GatewayWorker做了一个websocket定时向客户端发送数据的功能,通过利用定时器定时从某服务器获取数据,并发送给客户端。
 
且客户端可以切换发送数据的内容,每次切换回关掉之前的定时器后,再打开一个新的定时器。但是当我切换过快的话,却发现之前定时器没有被关闭,仍在发送数据,这样相当于发送了两次数据(比如,定时器时间间隔是5s执行一次,这时,出现的情况是相当于5s内会执行两次)。。(我测试了一下,如果我把切换的时间控制在2s的样子,则不会出现这个问题)
 
这是什么原因,应该如何解决?
 
在论坛中看见,说是多进程造成的,那我应该如何去把定时器放在同一个进程中。第一次玩GatewayWorker,还请大神指点一二
 
public static function onClose($client_id)
{
// 向所有人发送
global $this_client_id,$closed_data,$change2closed;
Gateway::sendToAll(json_encode('closing'));
if ($change2closed === true){
$preBName = $closed_data['get']['preBName'];
$pre_timer = $closed_data['get']['add_timer'];
$BName = $closed_data['get']['BName'];
}else{
$preBName = $GLOBALS['client_id_groupName'][$client_id];
$pre_timer = $GLOBALS[$preBName."_timer"];
}
$pre_countGroup = Gateway::getClientCountByGroup($preBName);
if ($pre_countGroup==0){
GateWay::sendToAll(json_encode('To all start_deleting'));
Gateway::sendToClient($this_client_id,json_encode('start_deleting'));
$del_result = \Workerman\Lib\Timer::del($pre_timer);
if ($del_result===false){
GateWay::sendToAll(json_encode(array(
'error' => 'del error!',
'preBName' => $preBName,
'pre_timer' => $pre_timer
)));
}
unset($GLOBALS[$preBName."_timer"]);
unset($GLOBALS['client_id_groupName'][$client_id]);
}
if ($change2closed === true){
$check_countByGroup = Gateway::getClientCountByGroup($BName);
if ($check_countByGroup!=0){
Gateway::joinGroup($this_client_id,$BName);
Gateway::sendToClient($this_client_id,json_encode(array(
'type' => 'addTimer',
'client_id' => $this_client_id,
'timer' => $GLOBALS[$BName."_timer"]
)));
Events::getXmlInfo($this_client_id,$closed_data,5);
}else{
Gateway::joinGroup($this_client_id,$closed_data['get']['BName']);
Events::getXmlInfo($this_client_id,$closed_data,5);
//调用定时函数为类的静态方法,具体可参考文档wokerman定时器手册
$timer = \Workerman\Lib\Timer::add(5,array('Events','getXmlInfo'),array($this_client_id,$closed_data,5));
$GLOBALS[$closed_data['get']['BName']."_timer"] = $timer;
Gateway::sendToClient($this_client_id,json_encode(array(
'type' => 'addTimer',
'client_id' => $this_client_id,
'timer' => $timer
)));
}
$change2closed = false;
Gateway::sendToClient($this_client_id,json_encode('close_succeed'));
}
}

 /*当客户端连接上gateway完成websocket握手时触发的回调函数。*/
public static function onWebSocketConnect($client_id,$data){
$httpReal = ['http://local.test.com','http://mytest.test1.cn'];
if (array_search($data['server']['HTTP_ORIGIN'],$httpReal) === false){
Gateway::sendToClient($client_id,"HTTP_ORIGIN为".$data['server']['HTTP_ORIGIN']."与".$httpReal."不一致,请修改httpReal与HTTP_ORIGIN一致");
Gateway::closeClient($client_id);
}else{
global $change2closed;
$change2closed = false;
$pre_cid = $data['get']['pre_cid'];
if ($pre_cid != "null"){//主要用于做同平台账号切换时,通过判断pre_cid(即client_id)是否为null,null则为第一次加载(即首次通过浏览器窗口打开此页面);若果不为空,则关闭这个client
global $this_client_id,$closed_data;
$this_client_id = $client_id; //设置一个全局可供调用的当前client_id供on_Close触发时,可以调用到正在执行中的client_id
$closed_data = $data; //设置一个全局可供调用的$closed_data供on_Close触发时,可以调用到本次传过来的$data(主要是使用$data['get']中的数据)
$change2closed = true;
Gateway::sendToClient($client_id,json_encode('start closeClient'));
Gateway::closeClient($pre_cid);
}else{
$check_countByGroup = Gateway::getClientCountByGroup($data['get']['BName']);
Gateway::sendToClient($client_id,json_encode(array(
'first-load' => '**********************',
'check_countByGroup' => $check_countByGroup
)));
if ($check_countByGroup!=0){
Gateway::joinGroup($client_id,$data['get']['BName']);
$GLOBALS['client_id_groupName'][$client_id] = $data['get']['BName'];
Gateway::sendToClient($client_id,json_encode(array(
'type' => 'addTimer',
'client_id' => $client_id,
'timer' => $GLOBALS[$data['get']['BName']."_timer"]
)));
Events::getXmlInfo($client_id,$data,5);
}else{
Gateway::joinGroup($client_id,$data['get']['BName']);
$GLOBALS['client_id_groupName'][$client_id] = $data['get']['BName'];
Events::getXmlInfo($client_id,$data,5);
//调用定时函数为类的静态方法,具体可参考文档wokerman定时器手册
if ($GLOBALS[$data['get']['BName']."_timer"] === null){
$timer = \Workerman\Lib\Timer::add(5,array('Events','getXmlInfo'),array($client_id,$data,5));
$GLOBALS[$data['get']['BName']."_timer"] = $timer;
}
Gateway::sendToClient($client_id,json_encode(array(
'type' => 'addTimer',
'client_id' => $client_id,
'timer' => $timer
)));
}
}
}
}

WSS负载过高

提问walkor 回复了问题 • 2 人关注 • 2 个回复 • 102 次浏览 • 2019-06-21 09:08 • 来自相关话题

tp5设置的session如何在wokerman中进行调用呢,好像都是空值

提问blogdaren 回复了问题 • 2 人关注 • 1 个回复 • 86 次浏览 • 2019-06-20 18:31 • 来自相关话题

在thinkPHP5.0已安装redis扩展的情况下,在onMessage中调用redis报错

提问blogdaren 回复了问题 • 2 人关注 • 1 个回复 • 101 次浏览 • 2019-06-20 16:08 • 来自相关话题

linux环境搭建gatewayworker,会自动断开

提问blogdaren 回复了问题 • 2 人关注 • 1 个回复 • 88 次浏览 • 2019-06-20 16:01 • 来自相关话题

如何正确且有效率的重新加载变量

提问blogdaren 回复了问题 • 2 人关注 • 1 个回复 • 94 次浏览 • 2019-06-20 15:57 • 来自相关话题

在phpsocket.io使用redis 报错

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 95 次浏览 • 2019-06-20 09:20 • 来自相关话题

workerman怎么把初始化io对象里面的id换成自己的id、

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 96 次浏览 • 2019-06-20 09:15 • 来自相关话题

使用tp5整合的workerman如何实现服务端推送

回复

提问wapmxls 发起了问题 • 1 人关注 • 0 个回复 • 183 次浏览 • 2019-06-19 19:56 • 来自相关话题

windows服务器启动失败,循环重启 terminated and try to restart

提问firzen 回复了问题 • 4 人关注 • 8 个回复 • 986 次浏览 • 2019-06-19 10:50 • 来自相关话题

isOnline($client_id)是在线的,但为什么getOnlineStatus获取列表为空?

回复

提问a894890640 发起了问题 • 1 人关注 • 0 个回复 • 78 次浏览 • 2019-06-19 10:13 • 来自相关话题

不懂为何在断开连接后还能在$_SESSION中准确的获取已断开的用户数据

提问blogdaren 回复了问题 • 2 人关注 • 2 个回复 • 103 次浏览 • 2019-06-18 21:32 • 来自相关话题

想用workerman来做个统计功能

回复

提问zjx12345 发起了问题 • 1 人关注 • 0 个回复 • 86 次浏览 • 2019-06-18 20:53 • 来自相关话题

无法使用try catch捕捉异常

提问six 回复了问题 • 2 人关注 • 1 个回复 • 88 次浏览 • 2019-06-18 20:43 • 来自相关话题

Worker[10046] process terminated

提问Durian 回复了问题 • 3 人关注 • 2 个回复 • 391 次浏览 • 2019-06-18 16:25 • 来自相关话题

在workerman中启用swoole驱动,ctrl+c 报以下错误

提问wenken 回复了问题 • 2 人关注 • 2 个回复 • 114 次浏览 • 2019-06-18 11:44 • 来自相关话题

http worker中处理请求第三方接口,并发能力如何保证

提问xiuwang 回复了问题 • 2 人关注 • 1 个回复 • 119 次浏览 • 2019-06-17 18:22 • 来自相关话题

Warning: stream_socket_enable_crypto(): Unable to set private key

提问wangdehua 回复了问题 • 2 人关注 • 1 个回复 • 833 次浏览 • 2019-06-17 16:51 • 来自相关话题

Timer定时执行逻辑,会导致主进程阻塞吗?

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 169 次浏览 • 2019-06-17 15:55 • 来自相关话题

怎么在自己电脑上搭建多个通信环境

提问walkor 回复了问题 • 2 人关注 • 1 个回复 • 98 次浏览 • 2019-06-17 15:50 • 来自相关话题

后端推送的消息如何经过Event.php

提问phpcode 回复了问题 • 2 人关注 • 2 个回复 • 113 次浏览 • 2019-06-16 22:22 • 来自相关话题