Работа PHP CRON и вызов функций при входе пользователя - PullRequest
0 голосов
/ 12 апреля 2011

Я надеюсь, что смогу получить какой-то совет.

В моей системе PHP / MySQL есть бухгалтерские бухгалтерские книги, с счетами, которые периодически попадают в бухгалтерскую книгу (для этого примера, скажем, раз в месяц),У меня также есть просроченные сборы, которые необходимо применять после определенной даты.Дата «выставления» счета-фактуры, а также дата «это уже поздно» уже есть в БД.

Мне интересно, какой из методов лучше подходит для запуска моего сценария, который автоматически применяет элемент бухгалтерской книги?(один раз в месяц) - и вводит плату за опоздание автоматически (также будет один раз в месяц, если это необходимо).Для всех пользователей системы эти даты разные - и, как я уже сказал, все хранятся в БД.Мои варианты, как я вижу это:

  • Иметь задание CRON, которое выполняется один раз в день (т.е. 12:00 утра каждый день) - и проходит через каждый элемент, выполняя работу, если условия датывстречаются.

    Мне кажется, мне нравится этот метод, потому что он заботится обо всем сразу, в одно и то же время каждый день.

    Я беспокоюсь об этом методе, потому что: (1)Что делать, если мой сервер не работает, когда мое задание CRON было запланировано, CPANEL полностью пропустит этот день сейчас?И (2) если у меня будет 100 тыс. Или даже 100 млн. Записей для просеивания, будет ли это невыносимой нагрузкой на мой сервер при каждом запуске?

  • Вызовите этот сценарий, чтобы «выполнить работу»если выполняются условия даты, только , когда этот связанный пользователь входит в систему.

    Причина, по которой мне не нравится этот метод, состоит в том, что становится все сложнее определить, сколько счетовподать заявку и сколько просроченных сборов.Кроме того, у меня есть пользователь с правами администратора, который может видеть ВСЕ от ВСЕГО - у этого пользователя может быть не актуальная информация регистрационной книги , если арендатор не вошел в систему достаточно недавно ...

    Мне нравится этот метод, потому что он, очевидно, меньше загружает сервер ...

Возможно, я слишком много думаю.Не уверен ... но совет будет высоко ценится.Спасибо.

Ответы [ 2 ]

1 голос
/ 12 апреля 2011

Я думаю, что работа cron - хорошая идея. Тем не менее, любой метод, который вы, вероятно, хотели бы иметь каким-либо способом помечать элементы (строки?) Как «обработанные». Ваша задача cron должна искать «необработанные» данные, а не по дате. Это, ИМХО, безопаснее и решит проблему, если по какой-то причине задание не запустится.

У меня есть похожая функция в одном из моих приложений. Тем не менее, это скорее стиль очереди. Задача помещается в очередь из любой части приложения. Рабочий (может быть вызван через cron) проходит через очередь и завершает задачу, помечает ее как «обработку» и затем обрабатывает. Если следующий работник приходит и находит задачу «обработка», он проверяет работника, чтобы убедиться, что он не зомби. Если это так, он убивает его, а затем перезапускает задачу. и т. д. и т. д.

У меня фактически есть одна главная очередь, которая может содержать различные типы задач (уведомления по электронной почте, обновления файлов и т. Д.), Затем рабочий обрабатывает основную очередь в определенные для работы очереди (одна для электронной почты и т. Д.).

1 голос
/ 12 апреля 2011

Я думаю, что лучше всего использовать вкладку cron для всех упомянутых вами преимуществ. Я бы добавил к этому, что если вы используете безопасную для транзакций таблицу, такую ​​как INNODB, и регистрируете завершение вкладки cron, если таблица падает во время crontab, изменения будут отменены, и вы можете проверить журнал, чтобы увидеть, какие даты были сбои, так что вы можете вручную внести изменения. Фактически, если вы регистрируете завершение задачи crontab в таблице, вы можете использовать этот журнал (считывая, сколько дней назад был запущен скрипт) для автоматической обработки пропущенных дней.

Что касается загрузки сервера, у вас, вероятно, не будет особых проблем с обновлением сразу нескольких записей. Дело в том, что при правильно структурированном запросе вы должны обновлять (или вставлять) только те записи, у которых есть дата, соответствующая выбранным параметрам. Вам не нужно на самом деле перебирать каждую запись в БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...