Как на php создать возможность отправлять уведомления по времени

Я создаю планировщик задач на php, с возможностью создавать дела на будущее. Эти дела записываются в БД mysql, естественно со временем. Вопрос в том что надо сделать для того что бы даже при не работающем сайте была возможность "как то проверять базу данных" и в точное время высылать сообщение пользователю о том что наступило событие! Скрипт отправки в телегу есть! Не понятно в целом как организовать.


Ответы (2 шт):

Автор решения: S.H.

Короткий ответ: php было придумано не для того, чтобы работать "в фоне". Идеология php - "отдай пользователю страницу и умри поскорее, освободи ресурсы!" - и функция die() в php на это как бы намекает.

Поэтому, переходим к "ответу средней длинны":

Итак, у Вас есть сервер. На нём никакой php скрипт работать не будет, пока кто то - обычно пользователь, открывший страницу в браузере - не вызовет какой то php - скрипт. Но Вы хотите, чтобы уведомление уходило пользователю даже в случае, когда он не находится на сайте. Ок, давайте сделаем это за пользователя! Нужно лишь, чтобы кто то вместо пользователя запускал скрипт, который провернёт всю эту магию: посмотрит в базу данных, посмотрит, есть ли там "дела, время котрых уже пришло, а вот уведомление пользователю еще не отправлено", и отправит уведомления.

Простой способ сделать это - запустить в cron задачу, которая раз в какое то время будет запускать этот магичесский скрипт. Заодно - если у Вас много пользователей, то скрипт может проверять дела для всех их сразу, и слать уведомления только тем, у кого дела наступили.

Конечно, это не очень экономное использование ресурсов. Во многих случаях, например, при ежеминутном запуске скрипта - он будет "стрелять вхолостую" - он проверил, а слать пользователю нечего. Зато этот способ реалььно простой.

Есть способ поэкономнее. Можно посмотреть "в будущее" и вычислить, сколько минут (или секунд) осталось до следующего запланированного события, и исходя из этого - "завести будильник", то есть, например, создать в том же cron задачу, которая выполнитсся ровно в момент следующего запланированного события. Этот способ сложнее вот по каким причинам: во первых, надо из php "заводить будильник". Это, вообще говоря, "запуск ссистемной задачи, которая может делать в системе что угодно" - в общем, надо думать о безопасности. Во вторых, если Вы уже "завели будильник", а потом пользователь зашел на сайт и что то там перепалнировал - завел новые дела, отложил или передвинул запланированные - то надо всю эту схему с "будильником" заново обновить: события то изменились.

Кроме того, сам по себе cron - не особо удобная для программирования штука, скорее всего, понадобится либо какая то обёртка над ним, либо вообще другой шедулер.

К счастью, для php и свои шедудеры есть, посмотрите вот эту статью.

→ Ссылка
Автор решения: Vit Saha

запуск раз в минуту run.php

&> /dev/null подавление отправки сообщений на разных спанельках синтаксис может отличаться

в run.php -- соединяешься с БД и выполняешь что нужно

crontab:

* * * * * /usr/bin/php -f /usr/local/bin/run.php &> /dev/null

https://stackoverflow.com/questions/18737407/how-to-create-cron-job-using-php

→ Ссылка