Подскажите, как выполнять действия через некоторое время?

remano

Я так понимаю, без CRON никак. Не пойму в последовательности. Не пойму что куда сохранять, как обновлять, помечать и очищать. Подскажите, пожалуйста, алгоритм.
Суть такая.
Есть таблица пользователей и таблица учета совершенных ими попыток. Каждая попытка сохраняется в БД (MySQL).
Иногда пользователь может забыть или передумать продолжать делать попытки. Необходимо каждое N-ое время, например, каждые 10 минут, если он пропал, отправлять ему уведомление о том, что у него остались попытки, возвращайся. И я так думаю, чтобы не заспамить его, таких уведомлений должно быть несколько, например, через 10 минут, через 50 минут и через 3 часа.

И каждые, например, 3 часа, начислять бонусные попытки тем, кто уже исчерпал основные и бонусные попытки, отправляя один раз сообщение, типа, вернись, я тебе начислил 2 попытки. А потом переносить пользователя в первый реестр, когда отправляются уведомления об оставшихся попытках.
В каком виде и где хранить эти данные, как отмечать отправленные и т.д.?

 

ADSoft

действия по расписанию однозначно через CRON, например запуск алгоритма каждую минуту (если много пользователей) или каждые 3 или 5 минут если поменьше.
Суть простая:
– в таблице с пользователями например два поля – кол-во попыток для данного пользователя, и кол-во оставшихся попыток, + время последней попытки чего-то там))))
– по крону, запускаете один скрипт который выбирает пользователей у которых
а) разница между текущим временем и последней попыткой более 3 часов, если нужно увеличиваете кол-во попыток, шлете письмо
б) более 50 минут, но менее 3 часов – делаете то что нужно
в) более 10 минут но менее 50 – делаете что нужно

хранить все лучше в БД ))) отмечать отправленные что? Если нужно только по 1 письму в период – ну добавьте в таблицу флаг какой то, при отправке письма меняйте его, при повторной проверке учитывайте флаг

 

remano

Еще есть нюанс, забыл указать. Пользователя может не быть в БД. Он туда попадает только после определенных действий, для начисления бонусов. А так он там не особо нужен. Происходит через VK API. Но это не так важно.

Основные попытки в отдельной таблице, пользователи в другой. Это как, например, статьи или новости и т.п. И у новостей есть категории. У пользователей в таблице есть поле с бонусами, их можно использовать куда угодно, а вот основные попытки учитываются именно к конкретной категории статей. Т.е. их для каждой категории всего 5 (для примера).
На примере. Пользователь добавил в категорию 3 статьи, а может 5 статей добавить. Осталось еще 2 попытки. Потом пропал. Нужно сделать выборку всех последних добавлений статей из конкретной категории (category_id) и посчитать их. Если их меньше 5, то значит у пользователя есть попытки и ему нужно отправлять сообщения. Каждая категория выбирается и проверяется отдельно, не сразу все. Например, на этой неделе запускается только одна, на следующей другая будет проверяться в течение недели и т.д.
:)
Поэтому у пользователя не получиться вести поле с кол-вом совершенных попыток, т.к. они обновляются для каждой категории заново, а в БД остаются старые попытки для архивных данных, так сказать.

Записей в категории может быть максимум 10000 штук.

 

remano

Вроде придумал: в таблице попыток сделать доп.поле enum. Если закончились попытки, то отметку ставить. И потом искать по этому полю. При добавлении бонусов снимать голочку у последней записи. Буду тестировать

 

mkramer

Я бы делал через очереди. У вас на чём написано? Самопис? Фреймворк?

Хорошие фреймворки уже содержат в себе такие вещи

 

remano

у меня пока просто код, без CMS, для VK чисто
Через какие очереди?

 

mkramer

А, тогда делайте через крон. Самому воркер писать долго. Очереди сообщений погуглите, если интересно про что я. Можно через всякие внешние штуки их делать, но фреймворки обычно предоставляют вариант прямо в базе данных хранить, для несложных проектов хватает

 

Репозиторий

Например через эти: https://laravel.su/docs/8.x/queues

Но если с Laravel не дружите – лучше таки да, самому написать что-то подобное – будет намного быстрее.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *