phpsocketio 过一夜 可以连接成功但是emit不执行
emit不执行的时候执行 php start.php status,截图下。注意是在emit不执行的时候截图
我的也是这样的
status 看没有问题。 如果要解决,需要你提供更详细的信息。 包括代码,测试方法,测试截图
@1:这个就是两段代码 一段是 js 第一段是 php
@1:就是 每个页面 都引入了 这段js代码,主要就是用来记录 当前用户在这个页面浏览了多长时间
不要在评论里放代码,没办法格式化。你在回复里放,还有测试步骤,测试结果截图
<?php use Workerman\Worker; use PHPSocketIO\SocketIO; include __DIR__ . '/vendor/autoload.php'; //全局数组,保存正在监听的页面的信息 $routeInfo = array(); // 传入ssl选项,包含证书的路径 $context = array( 'ssl' => array( 'local_cert' => '/etc/letsencrypt/live/xcx.ldcl3.cc/fullchain.pem', 'local_pk' => '/etc/letsencrypt/live/xcx.ldcl3.cc/privkey.pem', 'verify_peer' => false, ) ); include __DIR__.'/helper.php'; $Helper = new Helper(); // PHPSocketIO服务 $sender_io = new SocketIO(2120,$context); // 客户端发起连接事件时,设置连接socket的各种事件回调 $sender_io->on('connection', function($socket){ // 当客户端发来登录事件时触发 pdo_insert('logs',array('msg'=>'connection=>')); $socket->on('login', function ($data)use($socket){ pdo_insert('logs',array('msg'=>'login=>'.$socket->uid)); // 已经登录过了 if(isset($socket->uid)){ return; } global $Helper,$routeInfo; //这是浏览记录的参数 $uid = (string)$data['mid']; pdo_insert('logs',array('msg'=>'login=>'.$uid)); $uniacid = $data['uniacid']; $route_title = $data['route_title']; $route = $data['route']; $parem = $data['parem']; //额外参数 $courseid = $data['courseid']; $chapterid = $data['chapterid']; if(isset($routeInfo[$uid])){ //如果存在 则先释放掉之前的页面监听 //结束浏览 if($routeInfo[$uid]['routeid']>0){ $Helper->closeView($routeInfo[$uid]['routeid'],$routeInfo[$uid]['jointime']); } //结束浏览学习 if($routeInfo[$uid]['view_recordid']>0){ $Helper->closeStudyView($routeInfo[$uid]['view_recordid'],$routeInfo[$uid]['jointime']); } //结束学习 if($routeInfo[$uid]['play_recordid']>0){ $Helper->endStudy($routeInfo[$uid]['play_recordid'],$routeInfo[$uid]['play_starttime']); } } $socket->uid = $uid; if($chapterid>0){ $view_recordid = $Helper->intoStudyView($uid,$uniacid,$courseid,$chapterid); } $routeInfo[$uid] = array( 'jointime'=>time(), 'routeid'=>$Helper->intoView($uid,$uniacid,$route_title,$route,$parem), 'view_recordid'=>$view_recordid, ); }); $socket->on('study', function ($data)use($socket){ if(!isset($socket->uid)) { return; } global $Helper,$routeInfo; $type = $data['type']; $uid = $data['mid']; $uniacid = $data['uniacid']; $courseid = $data['courseid']; $chapterid = $data['chapterid']; //开始计数之前先结束掉正在计数的内容 if($routeInfo[$uid]['play_recordid']>0){ $Helper->endStudy($routeInfo[$uid]['play_recordid'],$routeInfo[$uid]['play_starttime']); } if($type=='start'){ $routeInfo[$uid]['play_recordid'] = $Helper->startStudy($uid,$uniacid,$courseid,$chapterid); $routeInfo[$uid]['play_starttime'] = time(); } }); // 当客户端断开连接是触发(一般是关闭网页或者跳转刷新导致) $socket->on('disconnect', function () use($socket) { if(!isset($socket->uid)) { return; } global $Helper,$routeInfo; //结束浏览 if($routeInfo[$socket->uid]['routeid']>0){ $Helper->closeView($routeInfo[$socket->uid]['routeid'],$routeInfo[$socket->uid]['jointime']); } //结束浏览学习 if($routeInfo[$socket->uid]['view_recordid']>0){ $Helper->closeStudyView($routeInfo[$socket->uid]['view_recordid'],$routeInfo[$socket->uid]['jointime']); } //结束学习 if($routeInfo[$socket->uid]['play_recordid']>0){ $Helper->endStudy($routeInfo[$socket->uid]['play_recordid'],$routeInfo[$socket->uid]['play_starttime']); } unset($routeInfo[$socket->uid]); }); }); if(!defined('GLOBAL_START')) { Worker::runAll(); } -------------------------------
define(['core', 'tpl'], function (core, tpl) { var modal = {}; var params = {}; modal.init = function (param) { params=param; modal.socket(); }; modal.socket = function () { // 连接服务端 var socket = io('https://xcx.ldcl3.cc:2120'); var data = { mid:params.mid, uniacid:params.uniacid, route_title:document.title ? document.title:'', route:document.URL, courseid:params.courseid, chapterid:params.chapterid, parem:params.parem, }; // 连接后登录 socket.on('connect', function($aa){ console.log($aa); socket.emit('login', data); }); //点击 发送 数据 $("#send_aa").click(function(){ socket.emit('study', data); }) }; return modal });
$Helper = new Helper(); 这里是初始化了数据库么?
是对数据库的一些操作
数据库连接是在哪里初始化的?
bootstrap.inc.php 这个文件里面的。
@walkor请问这是什么原因
<?php require dirname(__FILE__) . '/../../../../framework/bootstrap.inc.php'; class Helper{ private $route_view = 'ldy_shop_route_view'; private $play_record = 'ldy_shop_knowledgepay_play_record'; private $view_record = 'ldy_shop_knowledgepay_view_record'; /* * 记录浏览页面 * (int)mid 用户id, * (string)route 访问路径 * (string)route_title 路径对应的标题 */ public function intoView($mid,$uniacid,$route_title,$route,$parem){ //往记录表中增加记录 if(empty($parem)){ $parem = 'index'; } $mid = explode("_",$mid)[1]; //查询今天有没有浏览过这个页面 $view_log = pdo_fetch("select id,view_cnt from " .tablename($this->route_view). " where mid=:mid and parem=:parem and create_time between unix_timestamp(curdate()) and unix_timestamp(now()) order by id desc limit 1",array(':mid'=>$mid,':parem'=>$parem)); pdo_insert('logs',array('msg'=>serialize($view_log))); if(empty($view_log)){ //添加一条记录 $data = array( 'uniacid'=>$uniacid, 'mid'=>$mid, 'route'=>$route, 'route_title'=>$route_title, 'create_time'=>time(), 'view_cnt'=>1, 'view_time'=>1, 'parem'=>$parem, ); pdo_insert($this->route_view,$data); $id = pdo_insertid(); }else{ //更新一条记录 pdo_update($this->route_view,array('view_cnt'=>$view_log['view_cnt']+1),array('id'=>$view_log['id'])); $id = $view_log['id']; } return $id; } /* * 关闭连接(结束浏览) * 浏览记录ID $routeid * */ public function closeView($routeid,$jointime){ $view_log = pdo_fetch("select id,view_time from " .tablename($this->route_view). " where id=:id",array(':id'=>$routeid)); if($view_log){ //计算浏览时间 $view_time = time()-$jointime; //叠加时间 pdo_update($this->route_view,array('view_time'=>$view_log['view_time']+$view_time,'end_time'=>time()),array('id'=>$view_log['id'])); } return true; } /* * 开始学习 * */ public function startStudy($mid,$uniacid,$courseid,$chapterid){ //查询今天有没有学习过这个课程中的章节 $mid = explode("_",$mid)[1]; $play_record = pdo_fetch("select id from " .tablename($this->play_record). " where mid=:mid and courseid=:courseid and chapterid=:chapterid and create_time between unix_timestamp(curdate()) and unix_timestamp(now()) order by id desc limit 1",array(':mid'=>$mid,':courseid'=>$courseid,':chapterid'=>$chapterid)); if(empty($play_record)){ //添加一条学习记录 $data = array( 'uniacid'=>$uniacid, 'courseid'=>$courseid, 'chapterid'=>$chapterid, 'mid'=>$mid, 'create_time'=>time(), 'study_duration'=>1 ); pdo_insert($this->play_record,$data); $play_recordid = pdo_insertid(); }else{ $play_recordid = $play_record['id']; pdo_update($this->play_record,array('study_duration'=>$play_record['study_duration']+1),array('id'=>$play_record['id'])); } return $play_recordid; } /* * 结束学习 */ public function endStudy($play_recordid,$starttime){ $end_time = time(); $study_duration = $end_time - $starttime; // $play_record = pdo_fetch("select id,study_duration from " .tablename($this->play_record). " where id=:id",array(':id'=>$play_recordid)); if($play_record){ pdo_update($this->play_record,array('study_duration'=>$play_record['study_duration']+$study_duration),array('id'=>$play_recordid)); } return true; } /* * 开始浏览学习 * */ public function intoStudyView($mid,$uniacid,$courseid,$chapterid){ //往记录表中增加记录 $mid = explode("_",$mid)[1]; //查询今天有没有浏览过这个页面 $view_log = pdo_fetch("select id,view_cnt from " .tablename($this->view_record). " where mid=:mid and courseid=:courseid and chapterid=:chapterid and create_time between unix_timestamp(curdate()) and unix_timestamp(now()) order by id desc limit 1",array(':mid'=>$mid,':courseid'=>$courseid,':chapterid'=>$chapterid)); if(empty($view_log)){ //添加一条记录 $data = array( 'uniacid'=>$uniacid, 'mid'=>$mid, 'courseid'=>$courseid, 'chapterid'=>$chapterid, 'create_time'=>time(), 'view_cnt'=>1, 'view_time'=>1 ); pdo_insert($this->view_record,$data); $id = pdo_insertid(); }else{ //更新一条记录 pdo_update($this->view_record,array('view_cnt'=>$view_log['view_cnt']+1),array('id'=>$view_log['id'])); $id = $view_log['id']; } return $id; } /* * 结束浏览学习 * */ public function closeStudyView($view_recordid,$jointime){ $view_log = pdo_fetch("select id,view_time from " .tablename($this->view_record). " where id=:id",array(':id'=>$view_recordid)); if($view_log){ //计算浏览时间 $view_time = time()-$jointime; //叠加时间 pdo_update($this->view_record,array('view_time'=>$view_log['view_time']+$view_time,'end_time'=>time()),array('id'=>$view_log['id'])); } return true; } } ?>
bootstrap.inc.php 里面引入了 pdo方法,然后pdo 再去初始化数据库
判断无法触发emit是根据什么判断的,数据库没有写入数据了?
是根据数据库没有写入数据判断的,然后我也在想 是不是数据库一直连着,导致是数据库断开了
数据库初始化的时候 我是不是应该放在 connection的回调里面,这样每次用户连接的时候 就初始化
应该是数据库连接长时间不使用被mysql服务端断开了,然后你的数据库类没有做重连,导致数据无法写入数据库。 解决办法有2种 第一种、数据库连接使用完就关闭,下次使用时再重连数据库 第二种、把初始化数据库连接放到onworkerStart 里。并且做好数据库断开重连的操作,重连参考 https://github.com/walkor/mysql/blob/master/src/Connection.php#L1748 ,后者直接使用http://doc.workerman.net/components/workerman-mysql.html 这个数据库类,它自带重连功能。 $sender_io->on('workerStart', function()use($io) { // 初始化数据库连接 });
我用的是 phpsocketio 请问应该放哪个位置
初始化连接放到workerStart里 $sender_io->on('workerStart', function()use($io) { // 初始化数据库连接 });
谢谢
@1:已经把数据库连接 改成了workerman 自带的类,就看明天会不会断开连接了
测试就是 每次进入页面 都会去 连接 并且登录
emit不执行的时候执行 php start.php status,截图下。注意是在emit不执行的时候截图
我的也是这样的
status 看没有问题。
如果要解决,需要你提供更详细的信息。
包括代码,测试方法,测试截图
@1:这个就是两段代码 一段是 js 第一段是 php
@1:就是 每个页面 都引入了 这段js代码,主要就是用来记录 当前用户在这个页面浏览了多长时间
不要在评论里放代码,没办法格式化。你在回复里放,还有测试步骤,测试结果截图
$Helper = new Helper();
这里是初始化了数据库么?
是对数据库的一些操作
数据库连接是在哪里初始化的?
bootstrap.inc.php 这个文件里面的。
@walkor请问这是什么原因
bootstrap.inc.php 里面引入了 pdo方法,然后pdo 再去初始化数据库
判断无法触发emit是根据什么判断的,数据库没有写入数据了?
是根据数据库没有写入数据判断的,然后我也在想 是不是数据库一直连着,导致是数据库断开了
数据库初始化的时候 我是不是应该放在 connection的回调里面,这样每次用户连接的时候 就初始化
应该是数据库连接长时间不使用被mysql服务端断开了,然后你的数据库类没有做重连,导致数据无法写入数据库。
解决办法有2种
第一种、数据库连接使用完就关闭,下次使用时再重连数据库
第二种、把初始化数据库连接放到onworkerStart 里。并且做好数据库断开重连的操作,重连参考 https://github.com/walkor/mysql/blob/master/src/Connection.php#L1748 ,后者直接使用http://doc.workerman.net/components/workerman-mysql.html 这个数据库类,它自带重连功能。
$sender_io->on('workerStart', function()use($io) {
// 初始化数据库连接
});
我用的是 phpsocketio 请问应该放哪个位置
初始化连接放到workerStart里
$sender_io->on('workerStart', function()use($io) {
// 初始化数据库连接
});
谢谢
@1:已经把数据库连接 改成了workerman 自带的类,就看明天会不会断开连接了
测试就是 每次进入页面 都会去 连接 并且登录