Я разработал сценарий PHP, в котором я хочу отправлять автоматические письма пользователям. Я успешно реализовал задание cron с помощью сценария PHP, который проверяет таблицу очереди сообщений PHP на наличие ожидающих писем. Скрипт работает нормально, но задание cron работает странно: он отправляет почту пользователям, но по 3 или 4 за раз. Я хотел послать почту только один раз. Как я могу этого добиться?
Я использую условие, чтобы проверить, отправлено ли письмо или нет, если оно равно 0, оно отправит письмо и обновит значение до 1. Это условие работает нормально. Также относительная база данных показывает только одну запись для каждого пользователя, поэтому логически предполагается, что пользователю будет отправлено только одно электронное письмо, но вместо этого задание cron отправляет пользователю 3 или 4 одинаковых письма за раз.
Задаю cron каждые 2 мин. Команда выглядит следующим образом:
2 * * * * wget (Http PATH to SERVER)/Utils/MailQueue.php
Если вы считаете, что несколько экземпляров вашего скрипта могут выполняться одновременно, используйте какой-либо механизм блокировки. Поместите ваш wget в скрипт и оберните его в стадо команда
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/wgetscript
Если сценарий MailQueue.php находится на том же компьютере, на котором вы запускаете cron, вам не нужен wget.
2 * * * * /usr/bin/flock -n /tmp/myAppLock.lck /usr/bin/php /path/to/Utils/MailQueue.php
вероятно, будет лучшим решением, поскольку он будет работать без вашего веб-сервера.