workerman问题

浏览:936 发布日期:2019/10/08 分类:ThinkPHP5专区 关键字: workerman socket
workerman启动了 前台登录了 怎么给这个用户单独发送推送消息呢

心跳也成功了
现在不知道怎么在别的控制器里去做这个推送
worker。php代码
<?php
namespace app\push\controller;
use think\worker\Server;
use Workerman\Lib\Timer;
define('HEARTBEAT_TIME', 30); //心跳30秒

class Worker extends Server
{
protected $socket = 'websocket://fast.com:2346';
public $connectionArr = array();
/**
* 收到信息
* @param $connection
* @param $data
*/
public function onMessage($connection, $data)
{ $connection->lastMessageTime = time();
$wsData = json_decode($data,true);

if(!isset($wsData['option'])){
$connection->send('接收数据:'.$data);
return;
}
switch($wsData['option']){
case "login":
$connection->uid=$wsData['uid'];
echo $wsData['uid']."上线了";
$this->setOnline($connection);
break;
default:
$connection->send('其他数据');
break;
}
}

//如果是发送消息
public function sendMsg($data){

$msgStr = json_encode(array("option"=>"sendMsg","msg"=>"发给".$data['toUser']."的消息:".$data['msgContent']));

$this->connectionArr[$data['toUser']]->send($msgStr);
}

//用户上线
public function setOnline($connection){
$this->connectionArr[$connection->uid] = $connection;
}


/**
* 当连接建立时触发的回调函数
* @param $connection
*/
public function onConnect($connection)
{
}

/**
* 当连接断开销毁连接对象节约内存空间
* @param $connection
*/
public function onClose($connection)
{
}

/**
* 当客户端的连接上发生错误时触发
* @param $connection
* @param $code
* @param $msg
*/
public function onerror($connection, $code, $msg)
{
echo "\r\n error $code $msg\n";
}
/**
* 每个进程启动
* @param $worker
*/
public function onWorkerStart($worker)
{
// 进程启动后设置一个每秒运行一次的定时器
Timer::add(1, function ()use($worker){
$time_now = time();
foreach ($worker->connections as $connection) {
// 有可能该connection还没收到过消息,则lastMessageTime设置为当前时间
if (empty($connection->lastMessageTime)) {
$connection->lastMessageTime = $time_now;
continue;
}
// 上次通讯时间间隔大于心跳间隔,则认为客户端已经下线,关闭连接
if ($time_now - $connection->lastMessageTime > HEARTBEAT_TIME) {
$connection->close();
}
}
});
}

}
最佳答案
评论( 相关
后面还有条评论,点击查看>>