Как проверить, что аукцион закончен – Обработка Triggered PHP

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

Я пишу небольшой сайт аукциона в PHP / SQL, но я столкнулся с препятствием.

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

Единственный способ, о котором я могу думать, – запланировать часть кода, чтобы проверить, какие аукционы закончились, но, конечно, есть лучший способ?

Пожалуйста, будьте добры, чтобы поделиться сценарием SQL, который запрашивает самую высокую цену на основе даты окончания торгов (как узнать, что торги закончены) и присудить продукт самой высокой цене

Решение может быть в нескольких частях:

  • Скрипт , запускаемый через Cron (каждые 5 минут может быть хорошим, даже меньше …). Он обнаруживает законченный аукцион и помещает их в очередь .

  • Скрипт , который в значительной степени работает непрерывно , и обрабатывает элементы в очереди .

Обратите внимание, что :

  • Вы должны убедиться, что аукцион пока открыт, прежде чем отображать страницу! (простой тест) Таким образом, люди не могут присоединиться к нему после закрытия.
  • Для каждого скрипта вы можете использовать PHP или любой другой язык

Преимущества :

  • Задача cron очень быстрая, низкая на ресурсах, и если есть много аукциона для обработки, нет никакого риска, что он будет запускаться параллельно (а затем конфликты)
  • Система очередей гарантирует, что ваша система не потерпит крах, потому что слишком много продолжается … Она будет обрабатывать очередь как можно быстрее, но если она не будет достаточно быстрой, веб-сайт будет продолжать работать. Тем не менее, вы можете отправить электронные письма через часы или дни после закрытия аукциона. Но «предел» намного более предсказуем и не разрушит вашу систему.
  • Вы можете расширить его в будущем с помощью многопоточной обработки очереди, распределенной обработки … Это масштабируемая архитектура.
  • Эта архитектура – это весело.

Дополнительная информация:

  • Что касается сценария демона, я не должен работать постоянно. Что вы можете сделать, так это: в конце задания cron, если в очереди есть элементы, тогда он проверяет, работает ли другой скрипт (обработка). Если да, то выйдите. Если другой скрипт не запущен, он запускает его …
  • Скрипт daemon получает элемент из очереди и обрабатывает его. В конце, если в очереди все еще есть элементы, они обрабатывают его, иначе он выходит.
  • С этой системой все оптимально, и все любят друг друга!

Чтобы проверить, работает ли другой скрипт, вы можете использовать файл и записать в него «1» или «0» (= запуск / не работает). Первый скрипт читает его, второй пишет … Вы также можете использовать базу данных для этого. Или вы можете использовать системные инструменты или команду оболочки …

Я бы установил задание cron для запуска каждые 10-20-30-60 минут и т. Д., Чтобы отправлять электронные письма и обновлять информацию о аукционе.

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

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

Нужно ли немедленно отправлять эти электронные письма ?,

Я вижу две возможные проблемы и цели, которые вы пытаетесь достичь:

  • Визуальный : вы хотите, чтобы при просмотре веб-сайта пользователем без обновления или обновления страницы он постоянно обновлял страницу, чтобы, если прослушивание заканчивается, появляется что-то вроде «Audition закончился, элемент переходит к …». Решение . Вам следует использовать Javascript и AJAX. (Я предполагаю, что вы уже используете его для обратного отсчета или чего-то еще). Выполнять вызов AJAX каждые 5 секунд (может быть достаточно) и обновлять контент.
  • Pratical : вы хотите, чтобы, если прослушивание закончилось, пользователь не может присоединиться к нему. Решение. Вы можете сделать это только с PHP и mysql. Вы можете создать поля, в которых вы сохраняете if (time() >= ($timestamp + $duration)) {} метку начала прослушивания, а затем сделать простой if (time() >= ($timestamp + $duration)) {} (где $timestamp – начало прослушивания, а $duration – продолжительность прослушивания), чтобы заблокировать возможных плохих пользователей, пытающихся это сделать.