У меня есть следующий (упрощенный) пакетный процесс электронной почты, настроенный под Windows Server:
Это работает довольно хорошо, однако владельцы приложений хотели бы, чтобы определенные виды писем рассылались более регулярно, в данном случае каждые 20 минут.
Моей первой мыслью было настроить еще одну запись в планировщике задач, но это поднимает вопрос о том, что происходит каждые 6 часов, когда обе задачи будут выполняться одновременно. Это также потребует создания другого PHP-файла, который на самом деле не является проблемой, но раздражает.
Другая альтернатива, которую я рассмотрел, состояла в том, чтобы установить планировщик на каждые 20 минут и включить логику «что я отправляю и когда» в сам пакетный файл — если 12:00, 6:00, 12:00 или 6:00 выполняют оба набора электронных писем, в противном случае просто выполните 20 минут. Это, однако, требует жесткого кодирования в те времена, и не похоже, что это должно быть первым средством.
Есть ли лучший способ сделать это?
Подумав об этом немного больше, я понял, что могу достичь того, что хотел, с помощью функции PHP time () и некоторой арифметики по модулю:
$runTime = time(); //Set time the program was run, seconds since epoch
$modTimeHour = $runTime % 3600; //3600 seconds in an hour
$modTimeTwenty = $runTime % 1200; //1200 seconds in twenty minutes
//Task Scheduler doesn't always run exactly on the dot, so give it some leeway
if ($modTimeHour < 5 || $modTimeHour > 3595) {
//send emails - category 1
}
if ($modTimeTwenty < 5 || $modTimeTwenty > 1195) {
//send emails - category 2
}
Получив секунды с начала эпохи и проверив, находится ли по модулю количество секунд в интересующих меня периодах времени в определенном диапазоне, я могу получить множество различных «потоков», выходящих в нужное время.
Других решений пока нет …