У меня есть сайт для бронирования отелей.
Люди, которые имеют право, могут выбрать отель, даты и вместимость и оплатить заказ.
Когда клиент принимает решение и нажимает кнопку заказа, происходит несколько шагов:
Проверка заявки еще раз для цены и сбора информации о заказе
Экономия места для клиента для предотвращения перебронирования
Если клиент выходит на страницу orger, запускается null_timer и
сохраненные комнаты освобождаютсяЕсли клиент начинает заказ (на странице заказа), он не может обработать другой
заказы
$_SESSION['order_iddle']
а также таймер изменения, вызванныеJS триггер
window.onbeforeunload = function(){
timer_null();
return "";
}
Проверка PHP
if ((!isset($_SESSION['order_iddle'])) || (!$_SESSION['order_iddle']) ) {
header('location: https://home-page/');
}
$_SESSION['order_iddle']
обновления с таймером в php.timer_null()
отправляет ajax-запрос на php для обновления / проверки таймераЭта логика опирается на onbeforeunload()
функция, но если функция не работает в каком-либо браузере, у нас проблемы. Если есть лучший способ вызвать timer_null()
когда пользователь уходит со страницы заказа? Может быть в PHP?
когда onbeforeunload()
триггеры и клики пользователей «Оставаться на странице», timer_null()
сработал в любом случае.
Есть ли что-то делать с этим?
Лучшим вариантом будет присвоить ордеру значение истечения в вашем бэкэнде. Таким образом вы избежите срабатывания, проблем, когда пользователи не используют JS, проблем, когда они остаются на странице и т. Д.
Когда они делают заказ, установите текущее время плюс количество минут:
$order['expiry'] = time() + (5 * 60); // sets an expiry time for 5 minutes (5x60 seconds)
Затем на будущей странице, которая проверяет, действителен ли заказ:
if (time() > $order['expiry']) {
throw new Exception('This order is not valid');
}
Поймайте это исключение и верните его пользователю, как вам захочется.
У вас могут быть другие вещи в вашем случае использования, которые требуют, например, хранения в течение этих пяти минут. Однако, если вы также включите этот срок в свое хранилище данных, его можно будет использовать для проверки истечения срока в любых будущих заказах.
Если вы не хотите проверять тысячи потенциально просроченных записей каждый раз при создании нового заказа, вы можете создать своего рода сценарий «очистки» для автоматического запуска. Если вы не использовали crontab
прежде чем я предлагаю вам прочитать об этом, но сценарий должен запускаться каждый день в полночь с помощью crontab:
0 0 * * * php /var/www/my-clean-up-script.php
Затем в самом скрипте (псевдокод):
$expired_orders = database_query ( GET orders FROM table WHERE expired_time < current_time)
for each $expired_orders
database_query ( DELETE order)
Который должен работать для любого запрашиваемого хранилища данных.
Других решений пока нет …