@levantez

PHP, выполнение действия единоразово при условии многократного, единовременного обращения пользователей?

Всем доброго времени суток.
Есть онлайн игра, играет между собой например 10 человек, от каждого раз в секунду идут аякс запросы к серверу для получения изменений игры, в какой-то момент, например по завершению хода надо посчитать и начислить очки игрокам, проблема в том что при проверке, были ли уже начислены очки за этот ход, могут единовременно сработать 2-3 запроса, получив из базы инфу что очки еще не начислены и 2-3 раза начислить очки игрокам.
Решил проблему так: сначала пауза рандомом от 0 до 2.5 сек (дабы минимизировать вероятность одновременного выполнения), потом делаю запрос в БД с проверкой - была ли запись, если нет то ставлю отметку что была и считаю очки и начисляю. Такой алгоритм решил проблему полностью, но он все-таки кривой, интересно узнать какие методы решения существуют, т.е. мне надо выполнить действие гарантированно один раз при одновременном обращении к скрипту 10-20 человек
  • Вопрос задан
  • 344 просмотра
Решения вопроса 1
@shagguboy
курить "примитивы синхронизации". тебе нужен мьютекс.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега PHP
У вас в принципе архитектура кривая. Игру проще всего делать, когда инициатором получения изменений является сервер (через WebSockets, например). Тогда никакие действия не нужно будет делать несколько раз - посчитали => сформировали событие => разослали его всем подписчикам. А клиент уже только реагирует на эти изменения.
Ответ написан
AntonMinsk
@AntonMinsk
Как сказали выше, лучше, а я бы даже сказал правильно, чтобы изменения инициировал сервер и уведомлял клиентов через websocket.

Получается что не клиент запрашивает изменения, а сервер рассылает его клиентам.

Копайте в сторону socket.io
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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