3 дня долбаюсь с сокетами Help

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
zxczxc12
Сообщения: 161
Зарегистрирован: 2013.01.24, 21:16

3 дня долбаюсь с сокетами Help

Сообщение zxczxc12 »

Общем суть такая что нужно оживить сайт ( оповещение , чат и тп )

Использую 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();
    }
}
проблема в методе internalWorker
там массив с юзерами всегда нулевой :-(

я уже не знаю что делать
пробовал обьект хранить в редисе но обьект сокета не поддается сериалиации

есть у когото какие мысли или какая то готовая болванка ?

мне нужно не много
1) работать с socket.io
2) возможность передавать сообщение юзера бекенду
Закрыто