Напоминания
На работе часто возникает потребность напомнить самому себе о необходимости что-то сделать «такого-то числа». Наверняка у каждого программиста есть свой отработанный подход для решения этой задачи. Здесь я опишу ту элементарную «напоминалку», которой пользуюсь сам.
Требования просты. Когда поступает очередная задача «не забыть про...», вводим текст напоминания в специальную утилиту, назначаем дату и регистрируем напоминание. В назначенный день мы ожидаем получить письмо, содержащее список текущих напоминаний.
Что должно быть под рукой
- PHP-сервер — будем отправлять письма сами себе, т.е. пользоваться функцией mail();
- Сервер MySQL — напоминания будем хранить как запись «событие» в БД;
- Cron — диспетчер запуска для ежедневной проверки событий, требующих отправки.
Перейдем к деталям.
Детали
На словах идея довольно проста. В базе данных хранятся записи типа «событие» — в простейшем случае это время возникновения плюс сообщение (собственно напоминание). Формат события приведен ниже:
EVENT_N_ID | EVENT_T_DATE | EVENT_V_MESSAGE
Свойство EVENT_N_ID определяет уникальный идентификатор события. EVENT_T_DATE — дата возникновения с точностью до дня (такой гранулярности достаточно, чтобы каждое утро посылать себе, например, список дел на день). EVENT_V_MESSAGE — собственно текст напоминания.
Напишем пару скриптов. Первый (reminder_push.php) занимается наполнением событийной базы через интерфейс для ввода даты и текста сообщения. Второй (reminder_pop.php) итерирует событийную таблицу и отправляет все те сообщения, дата которых совпадает с текущей. Используя планировщик cron, мы настраиваем выполнение reminder_pop.php на каждое утро рабочего дня.
Детали (еще подробнее)
Принцип работы «напоминалки» представлен на схеме ниже:

Зелеными кружками на временной оси отмечены периодические срабатывания скрипта reminder_pop.php, который запланирован через cron. Во время каждого запуска, скрипт проверяет все события в базе, выбирая те из них, дата которых совпадает с текущей.
Реализовать такую систему практически ничего не стоит. Суммарные затраты на написание кода и организацию web-интерфейса составили около 4 часов, включая время на написание этой заметки.
Развитие подхода
При активном использовании описанного механизма сразу становятся очевидны его критические недоработки.
Во-первых, нет возможности запускать циклические напоминания — однажды активированное напоминание больше никогда не повторится. Во-вторых, работая в команде, желательно уметь адресовать напоминания не только себе, но и коллегам.
Тем не менее, описанные недостатки легко разрешимы и не являются принципиальными.