Я делаю свой проектик, учусь, никого не трогаю и тут ни с того ни с сего мне понадобился реалтайм. Я перекопал кучу доков по этой теме, нашел 100500 споров по теме, в общем, у меня есть куча информации, из которой я не могу понять, что лучше и как мне это нужно использовать.
Прежде всего я наткнулся на вот эту статью
habrahabr.ru/post/162301/, где автор рассказывает про свой сайт и страницу, которую постоянно нужно обновлять. Мне нужно то же самое, только на примере других игровых столов. К примеру, у нас есть игра в дурака, пользователи создают заявки или присоединяются к ним. Также нужно постоянно обновлять страницу и показывать содержимое.
Для себя я уже выбрал следующие инструменты: php, node.js, sockjs, redis.
Теперь у меня есть вопросы, как это должно все работать, к сожалению, в той статье автор практически ничего не показывал из кода и мало что объяснил.
Вопрос 1. Правильно ли я понял как построить архитектуру этого дела ?:
client - получает данные и рендерит страницу
<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
<script type="text/javascript">
var sock = new SockJS('http://127.0.0.1:9999/echo');
sock.onopen = function() {
console.log('open');
};
sock.onmessage = function(e) {
var data = JSON.parse(e.data);
console.log(data)
// Парсим
};
sock.onclose = function() {
console.log('close');
};
</script>
node.js сервер, получает данные из redis и отправляет на клиент
var http = require('http');
var sockjs = require('sockjs');
var redis = require('redis');
var client = redis.createClient();
client.subscribe("chan-1");
var echo = sockjs.createServer();
echo.on('connection', function(conn) {
/*setInterval(function(){
}, 1000);*/
client.on('message', function(channel, message) {
console.log(channel);
console.log(message);
console.log('---------------');
conn.write(message);
});
conn.on('close', function() {});
});
var server = http.createServer();
echo.installHandlers(server, {prefix:'/echo'});
server.listen(9999, '0.0.0.0');
И собственно самое главное, php который работает с данным и кидает их в канал:
$redis = new Redis();
$redis->pconnect('localhost', 6379);
$redis->publish("chan-1", json_encode(['test'=>'test']));
Вопрос 2 как правильно оперировать данными в php ?:
К примеру пользователь создает заявку на игру, как я понял необходимо послать данные новой заявки в канал ?
$redis->publish("chan-1", json_encode(['newGame'=>$data]));
Так-же если к примеру пользователь присоединился к заявке, необходимо послать данные для обновления страницы:
$redis->publish("chan-1", json_encode(['updateGame'=>$data]));
Ну и если игра стартовала, нужно убрать заявку:
$redis->publish("chan-1", json_encode(['endGame'=>$id]));
Получается, как я понял, при каждом таком действии пользователей нужно слать данные в канал. Правильно ли это?
Вопрос 3 Как правильно рендерить страницу?:
Страница из себя представляет таблицу, которая будет постоянно меняться (новые заявки будут появляться, старые исчезать а также данные в заявках могут изменяться, например добавляться игроки). Нужно перерисовывать каждый раз таблицу с 0 или же работать с конкретными ее частями? Как вообще в таком случае происходят расходы памяти?