Как отправлять сообщения чаще чем раз в минуту в Telegram на PHP?
Дано: у меня есть бот в Telegram. Он рассылает сообщения пользователям раз в определенное время. Обычно раз в сутки.
Схема работы такая:
Пользователь регистрируется, ему отправляется сообщение и считается время следующей отправки (дата регистрации + 86400 (день в секундах)). Оно хранится в базе данных.
Есть cron скрипт, выполняется каждую минуту. Есть суть простая:
1. Выбрать из базы данных всех пользователей, у которых время отправки следующего сообщения меньше, чем сейчас Unix время.
2. Отправить им сообщение по очереди через цикл
Если у сообщений разница в отправке хотя бы в минуту - две - все отлично.
Вопрос в следующем:
Я хочу сделать несколько сообщений в минуту. Просто есть некоторые сообщения, которые нужно отправить буквально друг за другом (с разницей в 10-15 секунд). Просто если делать им разницу в минуту, то они отправляются в среднем через 70-100 секунд (все зависит от количества пользователей в очереди и тд).
В общем, пользователь теряет фокусировку и ему надоедает ждать больше минуты следующего сообщения.
Думал сделать через sleep. Но в таком случае задержка отражается на работе всего бота - не знаю почему. Он начинает с задержкой откликаться на кнопки и тд.
Как минимум, сделать несколько очередей, которые будут отправлять сообщения только определенному кол-ву пользователей, тогда отправка сообщений будет быстрее за счет быстрого прохождения цикла.
mad_maximus, и так в одном запуске ограничиваю количество пользователей - 20-40 человек. Zhainar, потому что все 3 придут в одну секунду и пользователя прокрутит к последнему сообщению - неудобно, он может первое не дочитать
Через sleep точно такое себе решение. Если у вас монолитный скрипт, советую работу с кроном вынести отдельно и использовать его в потоке (react-php, примеров с ним очень много), а лучше вообще накидать простенький сервис на js, который сам будет слушать постоянно таблицу и отправлять сообщения. У меня также был бот телеграма, я его разделил на три части:
- сам бот (php)
- уведомления (nodejs)
- подписки (php)
Уведомления, как раз таки были на том, что слушалась таблица и при ее изменении отправлялись уведомления.
Подписки как и у вас были сделаны на кроне, запуск раз в пол часа
den94ka, тогда вместо sleep используйте его в потоке, это проще всего будет. Ответ сократится до пары секунд максимум. https://github.com/walkor/Workerman очень много примеров работы. Пример Timer, подойдет вам вполне, если нужно по быстрому накатать. Суть в том, что пых обычно выполняется и завершает работу, а тут идеология такая, что поток с php не завершается.