phpsocketio 過一夜 可以連接成功但是emit不執(zhí)行
<?php
use Workerman\Worker;
use PHPSocketIO\SocketIO;
include __DIR__ . '/vendor/autoload.php';
//全局數(shù)組,保存正在監(jiān)聽的頁面的信息
$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服務(wù)
$sender_io = new SocketIO(2120,$context);
// 客戶端發(fā)起連接事件時,設(shè)置連接socket的各種事件回調(diào)
$sender_io->on('connection', function($socket){
// 當客戶端發(fā)來登錄事件時觸發(fā)
pdo_insert('logs',array('msg'=>'connection=>'));
$socket->on('login', function ($data)use($socket){
pdo_insert('logs',array('msg'=>'login=>'.$socket->uid));
// 已經(jīng)登錄過了
if(isset($socket->uid)){
return;
}
global $Helper,$routeInfo;
//這是瀏覽記錄的參數(shù)
$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'];
//額外參數(shù)
$courseid = $data['courseid'];
$chapterid = $data['chapterid'];
if(isset($routeInfo[$uid])){
//如果存在 則先釋放掉之前的頁面監(jiān)聽
//結(jié)束瀏覽
if($routeInfo[$uid]['routeid']>0){
$Helper->closeView($routeInfo[$uid]['routeid'],$routeInfo[$uid]['jointime']);
}
//結(jié)束瀏覽學(xué)習(xí)
if($routeInfo[$uid]['view_recordid']>0){
$Helper->closeStudyView($routeInfo[$uid]['view_recordid'],$routeInfo[$uid]['jointime']);
}
//結(jié)束學(xué)習(xí)
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'];
//開始計數(shù)之前先結(jié)束掉正在計數(shù)的內(nèi)容
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();
}
});
// 當客戶端斷開連接是觸發(fā)(一般是關(guān)閉網(wǎng)頁或者跳轉(zhuǎn)刷新導(dǎo)致)
$socket->on('disconnect', function () use($socket) {
if(!isset($socket->uid))
{
return;
}
global $Helper,$routeInfo;
//結(jié)束瀏覽
if($routeInfo[$socket->uid]['routeid']>0){
$Helper->closeView($routeInfo[$socket->uid]['routeid'],$routeInfo[$socket->uid]['jointime']);
}
//結(jié)束瀏覽學(xué)習(xí)
if($routeInfo[$socket->uid]['view_recordid']>0){
$Helper->closeStudyView($routeInfo[$socket->uid]['view_recordid'],$routeInfo[$socket->uid]['jointime']);
}
//結(jié)束學(xué)習(xí)
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 () {
// 連接服務(wù)端
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);
});
//點擊 發(fā)送 數(shù)據(jù)
$("#send_aa").click(function(){
socket.emit('study', data);
})
};
return modal
});
<?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 路徑對應(yīng)的標題
*/
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;
}
/*
* 關(guān)閉連接(結(jié)束瀏覽)
* 瀏覽記錄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;
}
/*
* 開始學(xué)習(xí)
*
*/
public function startStudy($mid,$uniacid,$courseid,$chapterid){
//查詢今天有沒有學(xué)習(xí)過這個課程中的章節(jié)
$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)){
//添加一條學(xué)習(xí)記錄
$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;
}
/*
* 結(jié)束學(xué)習(xí)
*/
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;
}
/*
* 開始瀏覽學(xué)習(xí)
*
*/
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;
}
/*
* 結(jié)束瀏覽學(xué)習(xí)
*
*/
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;
}
}
?>
判斷無法觸發(fā)emit是根據(jù)什么判斷的,數(shù)據(jù)庫沒有寫入數(shù)據(jù)了?
是根據(jù)數(shù)據(jù)庫沒有寫入數(shù)據(jù)判斷的,然后我也在想 是不是數(shù)據(jù)庫一直連著,導(dǎo)致是數(shù)據(jù)庫斷開了
應(yīng)該是數(shù)據(jù)庫連接長時間不使用被mysql服務(wù)端斷開了,然后你的數(shù)據(jù)庫類沒有做重連,導(dǎo)致數(shù)據(jù)無法寫入數(shù)據(jù)庫。
解決辦法有2種
第一種、數(shù)據(jù)庫連接使用完就關(guān)閉,下次使用時再重連數(shù)據(jù)庫
第二種、把初始化數(shù)據(jù)庫連接放到onworkerStart 里。并且做好數(shù)據(jù)庫斷開重連的操作,重連參考 https://github.com/walkor/mysql/blob/master/src/Connection.php#L1748 ,后者直接使用http://doc.workerman.net/components/workerman-mysql.html 這個數(shù)據(jù)庫類,它自帶重連功能。
$sender_io->on('workerStart', function()use($io) {
// 初始化數(shù)據(jù)庫連接
});
初始化連接放到workerStart里
$sender_io->on('workerStart', function()use($io) {
// 初始化數(shù)據(jù)庫連接
});