PHP запускает скрипт при истечении сеанса

У меня есть приложение для корзины с уникальными элементами с количеством 1 – мне нужно истощить запас акций, когда пользователь кладет его в корзину, чтобы кто-то другой его не покупал. Проблема в том, что если они откажутся от тележки, не покупая, мне нужно вернуть товар на склад.

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

Вы можете использовать session_set_save_handler для создания настраиваемого класса обработки сеанса. Когда вы это сделаете, вы можете решить другие действия, которые должны выполняться либо при вызове сборщика мусора, либо при уничтожении сеанса. Если вы решили работать с сборщиком мусора, убедитесь, что вы также знаете значения для session.gc_divisor и session.gc_probability а также понимаете, что они делают (это задает вероятность запуска сборщика мусора).

Чтобы избежать необходимости работы cron; будь проще:

  1. Пользователь выбирает объект в своей корзине
  2. Временная метка для «размещения объекта в корзине» хранится в базе данных, а также сохраняется временная метка тайм-аута. Например (time() + (60*20))
  3. Пользователь закрывает веб-страницу
  4. На каждой странице вы делаете простой mysql-запрос, чтобы проверить, меньше ли временных меток времени, чем текущая временная метка. Если запрос возвращает результат, удалите из корзины и положите обратно в слот.

(Это требует, чтобы вы также обновляли какую-то «последнюю активность» в базе данных)

Должно быть довольно прямолинейно.

Создайте таблицу базы данных для отслеживания активности сеанса, например, sessions . В нем поместите по крайней мере поля session_id и поле DATETIME или TIME, называемые last_activity .

Если вы этого еще не сделали, также создайте таблицу carts которой содержится содержимое корзины (например, product_id и quantity ) и есть ссылка на session_id . Затем есть 2 сценария:

  1. Пользователь заканчивает заказ, просто «вытирает» строки в таблице carts принадлежащих их сеансу.
  2. Пользователь отказывается от корзины, вызывает cronjob, который проверяет, больше ли значение last_activity чем вы хотите, чтобы он был (скажем, больше часа назад). Сделайте этот сценарий повторно запасом вашего предложения с количеством, которое было в корзине.

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