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

У меня проблемы с созданием временного резерва для бронирования в PHP. Я провел исследование по этому вопросу, но, к сожалению, я не знаю, каковы точные условия для этого.

У меня уже есть рабочий модуль бронирования, мне нужно добавить функцию, которая автоматически отменяет это бронирование в течение 30 минут, если оно не подтверждено клиентом.

Есть ли фрагмент кода PHP, в котором он автоматически установит значение строки, если оно не было изменено в течение 30 минут?

PS: извините за плохой английский.

-1

Решение

Есть ли фрагмент кода PHP, в котором он автоматически установит значение строки, если оно не было изменено в течение 30 минут?

Нет. Это ориентировано на данные, возможно, ваше «резервирование» хранится в базе данных (например, MySQL)?

PHP как платформа в 99,9% случаев отвечает на запрос (CLI или HTTP) — или так называемый «управляемый событиями». Нет простого способа создать «событие» для чего-то, что истекает в будущем, не выходя за пределы чистого PHP.

Вы можете быть управляемый событиями при обновлении поля «обновлено в» с использованием метки времени вашей СУБД (например, см. ON UPDATE CURRENT_TIMESTAMP()) из которого вы можете проверить (при любом будущем событии), истек ли срок записи (последняя обновленная метка времени + 30 минут).

Если вам нужно сгенерировать событие когда истечет (например, отправьте электронное письмо, чтобы сказать, что резервирование было отменено), если у вас нет какого-либо «отложенного выполнения» (функция некоторых платформ массового обслуживания — вне рамок этого ответа), вам потребуется периодически опросить («вид», противоположный управляемому событием), чтобы найти записи, срок действия которых истек.

Наиболее распространенный способ сделать это через PHP в стеке LAMP — написать cronjob. Это постоянно работающий сервис, который будет (с максимальной частотой каждые 60 секунд) запускать ваш код.

Если вы идете по маршруту опроса, но вам нужно только манипулировать датой (без отправки электронной почты и т. Д.), Вы можете исследовать ее с помощью вашего планировщика СУБД (например, MySQL). events). Однако предупреждающее слово — сокрытие бизнес-логики внутри базы данных не всегда приводит к приемлемым решениям.


Добавлена ​​заметка: Если вы еще не используете PHP-фреймворк, подумайте о том, чтобы открыть для себя радости таких продуктов laravel которые дают вам task scheduling из коробки.

1

Другие решения

Я бы предложил другой подход:

один из этих 2 способов:
1) при проверке открытых бронирований всегда добавляйте чек WHERE createdat > NOW() - INTERVAL 30 MINUTE,
таким образом, вы будете только увидеть оговорки, которые еще могут быть подтверждены
Обратите внимание, что 30 минут теперь жестко запрограммированы в запросе / запросах.

2) когда время может меняться, вы можете также рассмотреть возможность добавления дополнительного столбца к вашей таблице: expiresat
При вставке бронирования вы можете указать момент до истечения срока бронирования:
INSERT INTO table (all, columns, expiresat) VALUES ('all', 'values', NOW() + INTERVAL 30 MINUTE)
таким образом, вы можете варьировать количество минут на заказ или давать людям больше времени на ночь.

При подтверждении вы можете сбросить значение этого столбца на ноль
И вы должны изменить запросы с помощью:
WHERE expiresat > NOW() OR expirexat is null

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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector