Как реализовать отслеживание БД и отправку push уведомлений через PHP?
PHP скрипт обращается к базе mssql через dblib. Изменения в бд заносятся через сторонний софт. Как можно отслеживать изменения в определенной таблице БД и рассылать клиентам скрипта? Менять базу и сторонний софт не вариант.
То есть, есть электронный журнал, в базе находится таблица оценок. Учителя ставят оценки через отдельную программу, которую нельзя изменить (у каждого свой экземпляр клиента, учителей много, пересобрать программу и разослать всем нельзя).
Есть веб-интерфейс, где выводятся оценки учеников. Любой ученик может зарегистрироваться и просмотреть свои оценки. Нужно создать скрипт, который будет проверять таблицу оценок и рассылать уведомления тем ученикам, которым поставили/изменили/удалили оценку. Как можно организовать такую проверку таблицы?
Менять/изменять базу не вариант. Вернее вариант, но нежелательный, поскольку создавали его другие разработчики, поддерживают третьи, а веб интерфейсом занимаемся мы. Тут используется правило "работает - не трожь". К тому же, если для триггеров нужна новая таблица, то в чем принципиальная разница с проверкой изначальной таблицы оценок каждые n минут?
в чем принципиальная разница с проверкой изначальной таблицы оценок каждые n минут?
в том, что не нужно будет дергать то, что не менялось...
я предлагаю такой вариант: при срабатывании триггера - в отдельной таблице фиксировать событие, а скриптом пробегать по этим изменениям и делать чего там надо... пометив при этом, что событие обработано.
Андрей Мохов: А разве в этом случае при изменении реплики оригинал не изменится? И еще вопрос, можно ли в триггере определить, какое поле изменилось? То есть какому ученику по какому предмету какой учитель поставил какую отметку?
ukoHka: реплику менять можно, с оригиналом ничего не будет, т.к. репликация идет от мастера к слэйву, тут главное понимать как работает репликация в MySQL...
если вкратце, то запросы, изменившие данные (INSERT, UPDATE, DELETE, ALTER, DROP) в точности дублируются на слейвы (при этом только те запросы, которые изменили данные, т.е.: UPDATE tbl SET col=col не продублируется, т.к. изменено строк 0)
Таким образом можно изменить структуру, даже добавить столбцы на слэйве к имеющимся таблицам, главное чтобы запросы с мастера транслировались без ошибок, если возникнет ошибка, то репликация будет остановлена.
Таким образом до MySQL 5.6 решалась проблема с InnoDB и полнотекстовым индексом, до 5.6 полнотекстовый индекс можно было вешать на MyISAM таблицы. На мастере была InnoDB с транзакциями и т.д., а на реплике MyISAM с полнотекстовым индексом, в случае поиска использовали слейв.
Без триггеров можете сделать проверку записей таблицы на обновление с помощью поля типа updated_at.
Подразумевается, что при обновлении записи в это поле будет сохранено время, когда запись была обновлена.
1. Задаете границу, позже которой будете уведомлять.
2. Дергаете записи, которые позже этой границы, рассылаете уведомления, если такие записи есть.
3. Передвигаете границу на текущее время
4. Через минуту начинаете с пункта 2
Для того, чтобы реализовать dirty checking, можете поля сохранять где-нибудь в Redis, тогда сможете проверять изменившиеся поля для обновленных записей.