многопользовательский сценарий

86
16 ноября 2020, 09:30

есть блок кода (назовем его $foo->bar() ) который должен выполнится один раз и только один раз. как это организовать в многопользовальском сценарии?

поясню, есть сценарий space.php к нему обращаются множество пользователей, в конкретном случае 20 человек.

мы проверяем, все ли пользователи дали ответ и если все - выполняем код $foo->bar() если же нет - пользователю предлагается дать ответ или ждать других участников если ответ дан.

по сути мне нужно вполнять $foo->bar() только когда последний пользователь даст ответ, либо по истечению тайм-аута

по окончанию работы $foo->bar() начинаем новый раунд, и все пользователи снова могут дать ответ. в ходе работы $foo->bar() есть логирование его выполнения, исходя из которого видно, что код инициализируется несколько раз.

как я вижу проблему: пользователи (user1, user2, ...., user20) обращаются к сценарию space.php user1, user2 и user3 дали ответ, ждут, ждут, ждут, обновляя страницу каждый раз $foo->bar() не может быть выполнен пока не дал последний пользователь user10. user1, user2 и user3 обновляют и ждут user10 дает наконец ответ и запускает $foo->bar() user1 и user3 обновляя страницу так же запускают $foo->bar() клонируя процесс. поскольку первый процесс еще не был выполнен, то и условия для запуска соблюдены.

ОК. делаем костыль. в базе данных , в таблицу сценария, объединяющего пользователей, добавил поле startrun default 0 и поред запуском $foo->bar() проверяем значение startrun: если 1 - процесс уже запущен. ожидаем выполнения. если 0 - устанавливаем startrun = 1, дабы предотвратить клонирование процесса, и запускаем процесс $foo->bar()

проблема в том, что костыль не работает. исходя из логов код по прежнему несколько раз запускается.

итак, как выполнить код, один только раз, в многопользовательском сценарии?

READ ALSO
Платежная система и запись в БД?

Платежная система и запись в БД?

Использую ОктябрьСоздана страница заказа, где собирается вся информация

155
Ошибки при постоянном соединении - MySQL server has gone away

Ошибки при постоянном соединении - MySQL server has gone away

После того, как устанавливаю параметр p: при коннекте к БД, в nginx error логах начинают вылетать ошибкиКак понял, данные ошибки возникают когда...

102
Вставка массива в БД

Вставка массива в БД

Есть массив данных price, полученный с помощью serialize Выглядит так: s:6:"54437";s:4:"5443";s:6:"5442

111