Использую Workerman SocketIO
делаю 2 сервера
1) на сокетах для работы с socket.io
2) для получения сообщений из бекенда для пересылки сообщений юзерам через 1-й
сделал массив где ключ- id юзера , значение - экземпляр обьекта socket ( что бы если надо обращаться к конкретно этому юзеру )
и тут мистика
этот массив никак не досупен для 2-го сервера , просто не понимаю как это воможно
Код: Выделить всё
class SocketServerController extends Controller
{
public $command;
public $suffix;
public $io;
public $users;
public function options($pref)
{
return ['command', 'suffix'];
}
public function actionIndex()
{
global $argv;
$argv[1] = $this->command ? $this->command : null;
$argv[2] = $this->suffix ? $this->suffix : null;
$this->io = new SocketIO(2020);
$this->io->on('connection', function ($socket) {
/* @var $socket SocketIO */
$php_session = Helper::parsePHPSession($socket->handshake['headers']['cookie']);
$user_id = $this->getUserBySession($php_session);
print "Add user: $user_id\n";
//$this->users[$user_id ]=$socket;
$this->users[1]='test';
$socket->on('new message', function ($data) use ($socket) {
$socket->emit();
});
});
$this->internalWorker();
Worker::runAll();
}
private function getUserBySession($session_id)
{
/* @var $redis_session yii\redis\Session */
$redis_session = Yii::$app->session;
$session_data = $redis_session->readSession($session_id);
if ($session_data) {
$session_data = Helper::unserialize_php($session_data);
if (is_numeric($session_data['__id'])) {
return $session_data['__id'];
}
}
return $session_id;
}
private function internalWorker()
{
$inner_tcp_worker = new Worker("tcp://127.0.0.1:2021");
// создаём обработчик сообщений, который будет срабатывать,
// когда на локальный tcp-сокет приходит сообщение
$inner_tcp_worker->onMessage = function ($connection, $data) {
var_dump($this->users); // <------ Вот тут всегда возвращает null ????
/**
* $data->event_name
* $data->data->user_id
* $data->data->message
*/
$data = json_decode($data);
$webconnection = $users[$data->data->user_id];
// отправляем сообщение пользователю по userId
if (isset($webconnection)) {
$webconnection->emit('new message',$data->data->message);
}
};
$inner_tcp_worker->listen();
}
}
там массив с юзерами всегда нулевой
я уже не знаю что делать
пробовал обьект хранить в редисе но обьект сокета не поддается сериалиации
есть у когото какие мысли или какая то готовая болванка ?
мне нужно не много
1) работать с socket.io
2) возможность передавать сообщение юзера бекенду