PHP Script как Cron Job для отправки электронной почты, предотвращения нескольких процессов - PullRequest
3 голосов
/ 17 апреля 2011

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

Поэтому я буду использовать задание cron для отправки электронного письма, которое будет запускаться через каждую минуту ипроверим, находится ли какое-либо письмо, ожидающее отправки.

Теперь мой вопрос: если в какой-то момент времени у меня есть 50-100 писем для отправки, то я думаю, что отправка письма может занять более 1 минуты, поэтому другая работа cronначнет запускать тот же скрипт.Так будет ли проблема?Потребляет ли сервер cron каждую минуту ресурсы сервера?если да, то каковы другие варианты достижения той же функциональности?

Пожалуйста, предложите !!

Спасибо

Ответы [ 3 ]

3 голосов
/ 17 апреля 2011

Использование стратегии блокировки файлов ... создайте файл блокировки при запуске нового процесса, и каждый последующий процесс должен проверять наличие этого файла блокировки перед запуском. Если файл блокировки существует, то вы знаете, что более ранний процесс все еще выполняется.

Однако необходимо убедиться, что существующий файл блокировки по-прежнему действителен . Возможно, процесс, создавший файл блокировки, завершил работу, не удалив файл блокировки. Запишите идентификатор процесса (PID) процесса, который создает файл блокировки, в файл блокировки. Более поздний процесс, который находит существующий файл блокировки, должен прочитать PID из файла, а затем убедиться, что процесс все еще выполняется.

Кроме того, рекомендуется ограничить количество сообщений, отправляемых вами за процесс. Если вы оставите его открытым, у вас могут возникнуть проблемы с системным администратором, который прервет ваш длительный процесс. :)

0 голосов
/ 25 августа 2011

Если вы работаете в Linux, вы можете использовать это, чтобы настроить регулярно выполняющуюся службу, которая будет продолжать работать, пока она не будет завершена, затем подождет минуту и ​​т. Д.

http://code.google.com/p/atomservice/

Я использую ее длятакие вещи, как это все время.Вы даже можете установить ограничение на x электронных писем для отправки за исполнение.

0 голосов
/ 17 апреля 2011

Ну, в любое время, когда я отправляю электронную почту через PHP, я делаю это через оболочку mailQ, которая не отправляет электронную почту мгновенно, а помещает ее в очередь для отправки (и отправляет через собственный автономный скрипт).Если вы выбрали такой же подход, вы можете просто добавить электронные письма в очередь (таблица SQL с сообщениями, получателями и т. Д. И флажком, указывающим, было ли оно отправлено).

Тогда вы все равно можетезапускайте скрипт каждую минуту, а затем создайте скрипт электронной почты (который ищет почтовую таблицу, чтобы узнать, есть ли ожидающие сообщения, которые нужно отправить), запустите его как отдельное задание cron - таким образом, рабочая нагрузка полностью разделяется на заданиядолжен работать параллельно.

И я могу со 100% уверенностью утверждать, что, пока ваш код надежен, выполнение задания каждую минуту никогда не должно быть проблемой.Я использовал этот подход в своей CMS в течение многих лет, чтобы сбалансировать нагрузку между обновлениями, которые не являются высокоприоритетными и будут только замедлять работу браузера для клиента.

У меня никогда не было производительности, нагрузки или задержкиС тех пор возникают проблемы с использованием такого подхода, и все продолжает быстро реагировать.

Я согласен с AJ, хотя важно ограничить количество сообщений, отправляемых за один пакет.Использование системы очередей идеально для этого, так как она отправляет только ожидающие X за один раз, и они все еще будут там в очереди.

...