Нужно делать массовую рассылку сообщений всем кто контактировал с ботом, понятно что нужно в базе хранить этих пользователей, и потом получать из базы все айдишники чатов и слать на них сообщения, но у телеграмма есть ограничения - до 30 запросов в секунду. Вот и сама проблема - как сделать так чтобы не "забанил" телеграмм, и чтобы php скрипт не висел в выполнении по 30 минут или часу - ибо шаред хостинг. :(
Создаете очередь из списка пользователей для которых необходимо сделать конкретную рассылку. Это может быть таблица в БД, список в редисе или мемкеше, или даже список в файле.
Создает скрипт который:
Берет n пользователей из списка п.1. Где n < допустимого числа сообщений.
Сейчас такой вариант и реализовываю.
Будет табличка "Рассылки" с полями названия текста, даты, офсеса для выборки, лимита, и состояния (завершена или нет)
Буду заходить в скрипт кроном каждые 5 минут:
Берём офсет по базе id чатов из таблицы рассылок запись у которой стоит статут не отправлено, рассылаем где-то 100 запросов делая пару прерываний - sleep(), пишем в базу новый офсет.
Через пять минут всё повторится. Ну и когда будет полностью всем отправлено выставим у рассылки статус отправлено.
Но возникают ситуации которые необходимо обработать:
Если в ходе рассылки 100 запросов скрипт сломался, то после перезапуска сообщения будут разосланы пользователям повторно.
Если в ходе рассылки произошла ошибка, необходимо переотправить сообщение.
Виктор Дидицкий, хм, да...
Но как реализовать тогда проверку было ли отправлено определённому пользователю сообщение из рассылки?
Просто рассылок будет куча, завести отдельную табличку под действующие рассылки?
Где будут поля с id определённого сообщения из таблицы с рассылками, id пользователя которому должно дойти, и статусом - дошло или нет?
Но пользователей будет около 1.5К, даже две рассылки дадут в базу уже 3К записей в одной таблице, боюсь представить что там будет через месяц... Нормально ли такое решение?
Получше в голову ничего не приходит.
Представьте себе очередь в которой находятся все пользователи. Вы поочередно достаете из очереди пользователя, отправляете ему сособщение, и, если сообщение успешно отправлено, удаляете сообщение из очереди. В терминах AMQP это получение сообщения с подтверждением.
Применительно к вашей задачи: все пользователи, которым необходимо отправить сообщение по рассылке, находятся в некоторой таблице. Вы получете пользователя, отправляете сообщение, удаляете пользователя из этой таблицы. Если что-то пошло не так пользователь не удаляется. В итоге в данной таблице останутся только те пользователи, которым не было отправлено сообщение.
Да, одновременно в данной таблице может находиться большое число пользователей. Но даже количество в 50к не должно создать вам особых проблем, учитывая что ваш процесс не ограничен по времени.
О чем стоит крепко подумать, так это о логировании отправляемых сообщение, и ошибках возникших в процессе.