Как на php создать возможность отправлять уведомления по времени
Я создаю планировщик задач на php, с возможностью создавать дела на будущее. Эти дела записываются в БД mysql, естественно со временем. Вопрос в том что надо сделать для того что бы даже при не работающем сайте была возможность "как то проверять базу данных" и в точное время высылать сообщение пользователю о том что наступило событие! Скрипт отправки в телегу есть! Не понятно в целом как организовать.
Ответы (2 шт):
Короткий ответ: php было придумано не для того, чтобы работать "в фоне". Идеология php - "отдай пользователю страницу и умри поскорее, освободи ресурсы!" - и функция die() в php на это как бы намекает.
Поэтому, переходим к "ответу средней длинны":
Итак, у Вас есть сервер. На нём никакой php скрипт работать не будет, пока кто то - обычно пользователь, открывший страницу в браузере - не вызовет какой то php - скрипт. Но Вы хотите, чтобы уведомление уходило пользователю даже в случае, когда он не находится на сайте. Ок, давайте сделаем это за пользователя! Нужно лишь, чтобы кто то вместо пользователя запускал скрипт, который провернёт всю эту магию: посмотрит в базу данных, посмотрит, есть ли там "дела, время котрых уже пришло, а вот уведомление пользователю еще не отправлено", и отправит уведомления.
Простой способ сделать это - запустить в cron задачу, которая раз в какое то время будет запускать этот магичесский скрипт. Заодно - если у Вас много пользователей, то скрипт может проверять дела для всех их сразу, и слать уведомления только тем, у кого дела наступили.
Конечно, это не очень экономное использование ресурсов. Во многих случаях, например, при ежеминутном запуске скрипта - он будет "стрелять вхолостую" - он проверил, а слать пользователю нечего. Зато этот способ реалььно простой.
Есть способ поэкономнее. Можно посмотреть "в будущее" и вычислить, сколько минут (или секунд) осталось до следующего запланированного события, и исходя из этого - "завести будильник", то есть, например, создать в том же cron задачу, которая выполнитсся ровно в момент следующего запланированного события. Этот способ сложнее вот по каким причинам: во первых, надо из php "заводить будильник". Это, вообще говоря, "запуск ссистемной задачи, которая может делать в системе что угодно" - в общем, надо думать о безопасности. Во вторых, если Вы уже "завели будильник", а потом пользователь зашел на сайт и что то там перепалнировал - завел новые дела, отложил или передвинул запланированные - то надо всю эту схему с "будильником" заново обновить: события то изменились.
Кроме того, сам по себе cron - не особо удобная для программирования штука, скорее всего, понадобится либо какая то обёртка над ним, либо вообще другой шедулер.
К счастью, для php и свои шедудеры есть, посмотрите вот эту статью.
запуск раз в минуту 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