Обновлять таблицу базы данных циклически каждые 5 минут

Я должен заполнить и обновить одну из моих таблиц базы данных MySql, используя сложный и дорогой запрос, основанный на выборе из данных другой таблицы. Эта таблица не должна быть всегда полностью обновлена, когда я делаю запрос к ней, но я хотел бы иметь циклическое обновление каждые 5 минут.

Это автоматическое обновление должно быть бесконечным, и я должен быть уверен, что оно никогда не останавливается.

После некоторых исследований я нашел какое-то решение, но я не знаю, какое лучше для безопасности и производительности.

Одна из них может быть моей целью:

  1. Не создавайте таблицу и каждый раз делайте сложный запрос из php, чтобы получить желаемый результат
  2. Создайте php-скрипт, который повторяется циклически, и обновите таблицу db, возможно, используя Cron Job.
  3. Обновление таблицы с использованием события sql

Я думаю, что первое решение может быть дорогостоящим, так как запрос сложный и может быть много запросов каждую секунду, но результат всегда обновляется. У меня нет опыта работы с Cron Job, поэтому я не знаю, может ли это быть хорошей идеей или нет. Что касается третьего решения, у меня все еще нет прав доступа к базе данных для запуска событий, но я хотел бы знать, может ли это быть правильным решением.

Все другие решения приветствуются, спасибо.

2 ответа

Решение

Не используйте cron. Подумайте о том, что произойдет, если один экземпляр выходит за пределы 5 минут, а следующий запускается. В конце концов у вас будут сотни копий, спотыкаясь друг о друга.

Вместо этого сделайте обновление в цикле. (Хорошо, у вас может быть задание cron для выполнения задачи "keep-alive" - перезапустить запрос, если он умирает.)

Работа будет

CREATE TABLE new ...
INSERT INTO new  SELECT complex-stuff...
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
loop.

Я бы выбрал Cron Job.

  1. Он не засоряет какой-либо запрос, так как выполняется из операционной системы.
  2. Вы можете определить, какой пользователь выполняет скрипт (cron -u apache -e).
  3. Легко определить интервал. (т.е. каждые 5 минут */5 * * * * php /path/to/script.php).
  4. Это регистрируемый.

Дополнительные примечания

У меня была работа cron под root, и она работала просто отлично. Моя проблема заключалась в том, что у проекта был частный механизм регистрации, каждый файл журнала создавался бы пользователем apache. При запуске его из root иногда файл будет создаваться root, и после этого скрипты, выполняемые apache, не смогут ДОБАВИТЬСЯ в журнал.

У меня также был скрипт электронной почты, который запускался раз в 2 минуты, который зависал на 1 час. Оказывается, из-за ошибки в приложении в базу данных был вставлен неверный адрес электронной почты (thingwithoutatsign.com), из-за чего библиотека PHPMailer выдает ошибки. После этого я добавил блок catch, который отправлял бы мне электронное письмо при возникновении исключения. Теперь, если скрипт перестает работать из-за плохого исполнения, я сразу узнаю.

Другие вопросы по тегам