Используя PHP, у меня есть запрос, который проходит через мою БД, ища ожидающие задачи с триггерами напоминания в определенное время дня. У меня есть cronjob, который запускается каждые 10 минут и проверяет DB для любых строк, у которых есть поле «remind_me», установленное для выхода в течение следующих 10 минут. Если он что-то найдет, как лучше всего поставить очередь на электронную почту с информацией о задаче?
Думаю, мне понадобится какая-то система очереди сообщений, но как работает электронная почта? Мне нужен другой cronjob, который запускается каждую минуту, чтобы проверить систему очереди?
Если вы хотите создать систему почтовых ящиков, я бы предложил вам взглянуть на PEAR :: Mail_Queue и связанный с ним учебник.
Вы могли бы стоять в очереди на почту, когда запускался ваш скрипт 10minute, и почтовый ящик опорожнялся каждые 10 минут с помощью задания cron. Вы также можете опорожнить почтовую очередь каждую минуту и реализовать время «не отправлять до» в очереди на указанную почту.
В качестве альтернативы вы можете запускать ваш скрипт проверки каждую минуту, проверяя элементы, которые должны появляться в течение последних десяти минут, и немедленно отправлять почту, что устраняет необходимость в системе очередей.
Это может быть выполнено с помощью записи о том, когда вы отправили последние предупреждения (чтобы вы не пропустили никого и не отправляли предупреждения дважды)
Надеюсь, это поможет.
Я совсем недавно написал собственное решение для очень похожей проблемы, используя PHP и MySQL.
По существу: задание cron запускает скрипт с заданным интервалом, этот скрипт проверяет базу данных на ожидающие задания, запускает их и удаляет задания.
Это просто то, что мне нужно было сделать, но оно может быть изменено для работы в течение временных интервалов.
Я написал отдельный PHP-скрипт, который запускает фактическую работу (систему рассылки новостей), чтобы сделать эту автоматизацию более полезной. То есть, я могу выполнить любую команду, которую я хочу от нее, я выполняю это, сохраняя имя фактической команды и ее аргументы в сценарии автомата.
exec("~/scripts/{$row['command']} {$row['args']}");
позволяет мне хранить аргументы в базе данных, чтобы сделать мой сценарий рассылки новостей более полезным. Вы используете массив $ argv для захвата аргументов, $ argv [0] – это имя сценария, аргументы следуют по порядку.
Я храню всю информацию информационного бюллетеня в отдельной таблице в базе данных, которая сортирует их в хронологическом порядке. Другими важными полями являются тема и тело письма. Затем я просто передаю два аргумента newsletter.php, чтобы сделать именно то, что я хочу: номер бюллетеня и номер подписчика (или все).
Тестирование на время (за 10 минут до) может быть выполнено с помощью чего-то вроде этого (я более упрощен для упрощения понимания):
date_default_timezone_set('America/Denver'); $month=;//without leading zeros $day=;//without leading zeros $hour=;//24 hour without leading zeros $min=;//needs leading zeros if($month==date(n) and $day==date(j)){ if($hour==date(G)){ if(($min-date(i))<=10){ //run command } }elseif(($hour-1)==date(g)){ if(($min-date(i))<=(-50)){ //run command } } }
Вы захотите изменить часовой пояс на свой собственный, и каким-то образом вывести информацию о дате и времени из БД.
Вторая часть скрипта (для запуска команд, запланированных в первые 9 минут в час) не тестировалась, но первая часть я быстро протестировал ее сейчас.
Надеюсь это поможет.
Я подумал о вашей проблеме немного больше, и это решение PHP, которое я придумал.
#!/opt/lamp/bin/php
– это путь к моему интерпретатору php. Вы должны изменить его на свой путь или просто запустить его с помощью php -f scheduler.php
scheduler.php
#!/opt/lampp/bin/php <?php // For testing purpose I set this to 5 seconds. You should set it to 600. $time = 5; while (true) { /* let's assume you store the emails scheduled from the database in this in memory array. */ $array = array( "Message to run last", #message which is scheduled last. "Message to run after first message", "Message to run immediately", #message which is scheduled first. ); $message = array_pop($array); while ($message != NULL) { echo $message . "\r\n"; /* For testing purpose I am just simply echoing out messages. In here you should sent mails using for exmample http://php.net/manual/en/function.mail.php */ $message = array_pop($array); // Get next message. } /* sleep $time. This is the "cron" part of your problem. */ sleep($time); }
Вы должны запустить этот скрипт из сценария bash, чтобы узнать, что он делает. Также код был хорошо документирован. Скрипт должен работать вечно (в фоновом режиме).
Это также не решение только для PHP , но я думаю, что это будет лучше, чем решение PHP, которое я придумал. Я все еще работаю над этим, но мне нравится то, что я придумал.
Я знаю, что это не PHP-решение, но когда вы не можете установить очередь сообщений, я думаю, что Google App Engine – лучшее решение . Когда я увидел это видео-введение от Бретта Слаткина к движку Google, используя Python SDK, я был продан движку Google App. Это займет всего 10 минут вашего времени, и вы узнаете, как создать базовую гостевую книгу и развернуть ее в облаке. Ниже, если интересно, я попытаюсь объяснить, какие части вам нужно сделать в Google App Engine.
Думаю, мне понадобится какая-то система очереди сообщений
Возможно, вы могли бы использовать задачу задачи google-приложения для qeueu задачи. В задаче даже есть этата, которую вы можете настроить для запуска в определенное время. У Google App engine есть бесплатная бесплатная квота . Каждый день вы можете добавлять 100 000 очередей в задание бесплатно.
но как работает электронная почта
Для этого я бы использовал движок Google. Вы можете использовать почтовую службу движка Google. Он также имеет щедро бесплатную квоту (2000 получателей в день). Я бы посоветовал вам просто отправить почту api из очереди, чтобы отправить сообщение.
У нас есть аналогичная система (это приложение ASP.NET, поэтому у нас есть службы для запуска этого с использованием внутреннего планировщика … но детали неважны). У нас есть одна большая таблица очередей сообщений, которая содержит отправленные данные электронной почты, адрес и строку темы (фактические письма генерируются из шаблонов). Способ, которым работает наша система, заключается в том, что после заполнения строки мы немедленно запускаем задачу отправки, которая собирает все ожидающие письма и отправляет их. Он пытается отправить их 3 раза, и если это не удается, они попадают в состояние отказавшего состояния. У нас есть задание cron, которое выполняется каждые 5 минут, чтобы выполнить любые неудачные задачи (вещь очень редко терпит неудачу, если они связаны с сетевой проблемой в 99% случаев).
Как часто вы хотите отправить электронное письмо? Если это происходит (в тот момент, когда он обнаружен вашим существующим cronjob, то есть каждые 10 минут), вы можете заставить скрипт, который ищет флаг напоминания, сделать это:
1 – добавьте ссылку на каждую строку, в которую был найден флаг в массив, например
$reminders = array(1, 3, 212);
Каждый элемент массива ссылается на первичный ключ вашей таблицы задач, здесь я использовал «задачи».
2 – после того, как поиск базы данных будет завершен, см., Если $ напоминания не пустые, а затем выполните запрос типа
$query = "SELECT * FROM tasks WHERE id = '".implode(',', $reminders)."'";
для получения всех конкретных данных
3 – отправьте электронное письмо с этими данными, используя почту .
Это то, что вы искали?