Задать вопрос
@hidden_pingvin

Какие методы/библиотеки/технологии использовать в web-проекте?

На сервере дана небольшая карточная игра, написанная на php, без какого-либо интерфейса, использующая вместо пользователей встроенных ботов. Игра идет на выбывание, первый выбывший - победитель, последний оставшийся - проигравший. Ходят игроки по очереди, когда очередь кончается - начинается новый цикл, очередь идет заново. Каждый игрок раз в цикл делает один ход.
Боты сейчас играют между собой и клиент пока лишь может наблюдать результаты. Необходимо:
1) Заменить ботов на людей
2) И соответственно написать интерфейс
Внимание вопрос:
Используя какие методы/библиотеки/технологии можно не прерывая работы php-скрипта общаться с клиентом, собирать у него данные и использовать их для работы скрипта?
Просто сейчас скрипт выполняется непрерывно, и страница не перезагружается (т.к. если ее перезагрузить это будет уже новая игра), а с добавлением клиентов, от которых уходит запрос через AJAX такое уже не прокатит.
Пробую копать в сторону сохранения позиций игроков на поле путем сохранения объектов игры (serialize) в БД через каждый цикл и соответственно в начале следующего его разворачивая, но это уж как-то изощренно получается.
  • Вопрос задан
  • 379 просмотров
Подписаться 4 Оценить 3 комментария
Решения вопроса 2
> в БД через каждый цикл и соответственно в начале следующего его разворачивая, но это уж как-то изощренно получается.
Ничего изощренного в этом нет, по крайней мере если хотите это все реализовать на PHP.
Паттерн применения этого языка такой, что лучше таки давать скриптам быстро отрабатывать ценой необходимости сохранения состояния. Дополнительными плюсами автоматически идут:
масштабирование (один сервер может сохранить состояние, а уже другой - извлечь) и надежность - упавший скрипт не убьет игру.
В качестве БД советую взять Redis или Mongo, можно даже в паре, РСУБД для сохранения состояния игры будет малополезным решением, хотя будет гораздо полезнее для сохранения и обработки статистики, если таковая планируется.
Ответ написан
copist
@copist
Empower people to give
Общий ответ: вебсокеты и асинхронные сообщения через pub/sub
В гугле искать по фразам "socket.io rabitmq" "php rabbitmq" "php websocket" "php pub/sub"

Вариант реализации с использованием PHP
На клиентском приложении: socket.io + javascript
На сервере: socket.io + RabbitMQ + PHP

Чтобы следить за игровым процессом:
Скрипт PHP будет посылать сообщения в очередь на RabbitMQ
socket.io будет читать очередь RabbitMQ и пересылать в веб-сокеты

Клиентское приложение в браузере будет создавать постоянное соединение к сервером по протоколу веб-сокетов и читать из него всё, что пришлёт сервер socket.io. Всё, что присылается, нужно будет показывать в веб-интерфейсе.

Чтобы управлять игровым процессом
Из клиентской части веб-приложения нужно будет отправлять команды управления через AJAX или через то же соединение веб-сокет.
В случае "через AJAX" нужно будет создать серверное микро-приложение, которое будет принимать команды через AJAX и затем передавать в основной игровой процесс через RabbitMQ или иным способом.
В случае "через веб-сокет" серверная сторона socket.io должна будет отрабатывать полученные команды и передавать в основной игровой процесс через RabbitMQ или иным способом.

На сервере нужно будет периодически делать дамп состояния основного серверного игрового процесса и сохранять в какую-нибудь базу. Я бы предложил дамп хранить в формате JSON в базе NoSQL, например, Mongo, CouchDB, Redis.
При перезапуске основного серверного игрового процесса нужно будет восстанавливать состояние из этого дампа.

Игрокам нужно будет выполнять авторизацию. У нескольких игроков может быть один игровой мир или отдельный микро-мир на несколько пользователей или на отдельный сеанс игры (например, одна шахматная доска на двух игроков и несколько зрителей). Поэтому надо будет хранить данные о пользователях и мирах. Вот тут подойдёт SQL база, например, MySQL или PostgreSQL. Хотя и NoSQL тоже можно использовать.

Ну как то так.
Выглядит замысловато, а на деле реализуется очень просто.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@LiguidCool
Так один фиг AJAX, просто при запросе он должен передавать ID игры (считай комнаты) в которую хочет войти.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы