代码拉取完成,页面将自动刷新
<?php
use Workerman\Worker;
use Workerman\WebServer;
use Workerman\Lib\Timer;
use PHPSocketIO\SocketIO;
include __DIR__ . '/vendor/autoload.php';
// 全局数组保存loginId在线数据
$uidConnectionMap = array();
// 记录最后一次广播的在线用户数
$last_online_count = 0;
// 记录最后一次广播的在线页面数
$last_online_page_count = 0;
// PHPSocketIO服务
$sender_io = new SocketIO(2120);
// 客户端发起连接事件时,设置连接socket的各种事件回调
$sender_io->on('connection', function($socket){
// 当客户端发来登录事件时触发
$socket->on('login', function ($data)use($socket){
global $uidConnectionMap, $last_online_count, $last_online_page_count;
$data_json = json_decode($data,true);
$uid = $data_json['loginId'];
// @file_put_contents('/tmp/timed.txt',$data.PHP_EOL,FILE_APPEND);
// 已经登录过了
if(isset($socket->uid)){
return;
}
// 更新对应uid的在线数据
//$uid = (string)$uid;
if(!isset($uidConnectionMap[$uid]))
{
$uidConnectionMap[$uid] = 0;
}
// 这个uid有++$uidConnectionMap[$uid]个socket连接
++$uidConnectionMap[$uid];
// 将这个连接加入到uid分组,方便针对uid推送数据
$socket->join($uid);
$socket->uid = $uid;
$result_json = get_data($data,$is_done='login');
// 更新这个socket对应页面的在线数据
$socket->emit('update_online_count', $result_json);
});
$socket->on('wave_done', function ($id)use($socket){
@file_put_contents('/tmp/timeds.txt',$id.PHP_EOL,FILE_APPEND);
$result_json = get_data($id,$is_done='login');
// 更新这个socket对应页面的在线数据
$socket->emit('update_online_count', $result_json);
});
$socket->on('start_done', function ($id)use($socket){
//@file_put_contents('/Users/fanweifeng/Documents/moon.txt',$id);
$result_json = get_data($id,$is_done='start_done');
// 更新这个socket对应页面的在线数据
$socket->emit('update_online_count', $result_json);
});
$socket->on('end_done', function ($id)use($socket){
//@file_put_contents('/Users/fanweifeng/Documents/moons.txt',$id);
$result_json = get_data($id,$is_done='end_done');
// 更新这个socket对应页面的在线数据
$socket->emit('update_online_count', $result_json);
});
$socket->on('over_done', function ($id)use($socket){
//@file_put_contents('/Users/fanweifeng/Documents/moon1.txt',$id,FILE_APPEND);
$result_json = get_data($id,$is_done='over_done');
// 更新这个socket对应页面的在线数据
$socket->emit('update_online_count', $result_json);
});
// 当客户端断开连接是触发(一般是关闭网页或者跳转刷新导致)
$socket->on('disconnect', function () use($socket) {
if(!isset($socket->uid))
{
return;
}
global $uidConnectionMap, $sender_io;
// 将uid的在线socket数减一
if(--$uidConnectionMap[$socket->uid] <= 0)
{
unset($uidConnectionMap[$socket->uid]);
}
});
});
// 当$sender_io启动后监听一个tcp端口,通过这个端口可以给任意uid或者所有uid推送数据
$sender_io->on('workerStart', function(){
// 监听一个tcp端口
//$inner_http_worker = new Worker('tcp://10.47.106.230:2121');
$inner_http_worker = new Worker('tcp://127.0.0.1:2121');
$inner_http_worker->count=4;
// 当tcp客户端发来数据时触发
$inner_http_worker->onMessage = function($http_connection, $data){
global $uidConnectionMap;
$result_json_data = json_decode($data,true);
global $sender_io;
//分别通过loginId推送数据
if($result_json_data['list']) {
// if(!empty($result_json_data['loginId'])){
// $sender_io->to($result_json_data['loginId'])->emit('new_msg', $data);
// }else{
// $sender_io->emit('new_msg', $data);
// }
$sender_io->emit('new_msg', $data);
}
// @file_put_contents('/tmp/data_test.txt',$data,FILE_APPEND);
// http接口返回,如果用户离线socket返回fail
if(!empty($result_json_data['loginId']) && !isset($uidConnectionMap[$result_json_data['loginId']])){
return $http_connection->send('offline');
}else{
return $http_connection->send('ok');
}
return $http_connection->send('fail');
};
// 执行监听
$inner_http_worker->listen();
});
function get_data($uid,$is_done){
//演示
//$url = 'http://test-dtq2.qinxue100.com/Game/Redtest';
//线上
$url = 'http://dtq2.qinxue100.com/Game/Red';
if($is_done == 'start_done'){
$push_api_url = $url."/start_rob";
}elseif($is_done == 'end_done'){
$push_api_url = $url."/end_rob";
}elseif($is_done == 'over_done'){
$push_api_url = $url."/get_statistics";
}else{
$push_api_url = $url."/socket_new";
}
// @file_put_contents('/Users/fanweifeng/Documents/test.txt',$uid,FILE_APPEND);
// @file_put_contents('/Users/fanweifeng/Documents/url.txt',$push_api_url);
$post_data = json_decode($uid,true);
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:"));
$return = curl_exec ( $ch );
curl_close ( $ch );
return $return;
}
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。