<?php
namespace app\index\controller;
use app\common\model\box\Box;
use app\common\model\box\BoxRecord;
use app\common\model\ornaments\Ornaments;
use app\common\model\system\Site;
use app\common\model\user\User;
use think\worker\Server;
use Workerman\Lib\Timer;
define('HEARTBEAT_TIME', 55);
class Worker extends Server{
浏览器控制台也没有报错 需要命令行重启后才恢复
get_box_record() 贴下
顺便 写一个这个看看,是否因为 缓冲区满 不再发送数据,或者客户端已断开
老哥贴了 就是简单的返回数据
好的我试试
如果是缓存满了 需要怎样清理呢
发生错误返回信息了
建议加大宽带,如需帮助,官方群:260671135
浏览器与服务端的ws连接断开了
是需要长连接加心跳吗
需要心跳,心跳可以维持连接,但是也无法保证连接不断开,客户端做断开重连的逻辑
好的
还有个问题,get_box_record的定时器没有关闭的逻辑,随着get_box_record请求增多,定时器也会增加,久而久之可能会有成千万的定时器,这样感觉会有内存泄漏,而且这上万定时器一起请求数据库数据库估计会挂。不用的定时器应该及时关闭才对
有客户就会请求这个
每次链接都创建一个定时器,而且从来不销毁,最后结果只能是内存溢出.如果说里面涉及到连接数据库,那直接可能耗死数据库了.
看你代码也没有说需要传递什么参数,那说白了就是一个群发功能,启动的时候创建一个定时器群发就是了
<?php
namespace app\index\controller;
use app\common\model\box\Box;
use app\common\model\box\BoxRecord;
use app\common\model\ornaments\Ornaments;
use app\common\model\system\Site;
use app\common\model\user\User;
use think\worker\Server;
use Workerman\Lib\Timer;
define('HEARTBEAT_TIME', 55);
class Worker extends Server{
// $list = $this->get_box_record();
$connection->send(json_encode(['code' => 200, 'msg' => '获取成功', 'method' => $method, 'list' => []]));
$this->get_box_record_repeat($connection, $method);
}, [], false);
}
}
这是整体的代码
js端:
var ws, timeid;
function create(){
ws = new WebSocket("wss://{$Think.server.HTTP_HOST}/wss");
ws.onopen = function() {
ws.send(JSON.stringify({method:'get_box_record'}));
timeid = setInterval(function(){
ws.send("ping");
}, 10000);
};
ws.onmessage = function(e){
var data = JSON.parse(e.data);
var code = data.code;
var msg = data.msg;
var method = data.method;
var content = data.list;
if (code == 200){
eval(method)(content);
} else {
// alert(msg);
}
};
ws.onclose = function(){
clearInterval(timeid);
setTimeout(function(){
create();
}, 1000);
}
}
create();
在 onWorkerStart 加
在 case 'get_box_record': //获取开箱记录 下面加
$connection->get_box_record = $method;
然后把你自己定时器去掉,
再把
if ($worker->id === 0){
}去掉.
好的谢谢