В основном у меня есть онлайн-игра, построенная на PHP (Laravel).Это функциональность довольно проста.Когда игрок экипирует предмет, он проверяет, экипирован ли предмет того же типа.Если нет экипированного предмета того же типа, он будет идти дальше и экипировать предмет.
Это можно сделать, просто установив флаг экипировки на модели инвентаря равным 1. Что-то вроде этого
if($alreadyequippeditem == false){
//equip current item
$inventory = \App\Inventory::find($item->pivot->id);
$inventory->equipped = 1;
$inventory->save();
}
Однако, если сделать это достаточно быстро, человек может экипировать два (или даже больше) предмета одновременно в одно и то же время.По сути, в обход проверки.
Мне кажется, что два запроса обрабатываются сервером в одно и то же время, и они оборудуют элементы в одно и то же время, и это по существу обходит проверки.Это может объяснить, почему два предмета могут быть оборудованы, потому что во время выполнения запросов они не распознают друг друга.Я могу ошибаться, но это единственное объяснение, которое я могу придумать.
Как я могу обойти это?Есть ли способ ограничить его, чтобы одновременно отправлялся только 1 запрос?Я не могу вспомнить, чтобы когда-либо сталкивался с этой проблемой, когда я создавал системы с ядром PHP и без фреймворка, поэтому я понятия не имею, вызвано ли это какой-то конфигурацией laravel.Я понимаю, что, возможно, смогу обойти это, используя очереди (хотя я не особо разбирался в этом), но я бы предпочел найти решение, которое работает по всему сайту, поскольку эта конкретная проблема затрагивает многие области системы.