я бы определенно не советовал использовать для этого cronjobs.
cronjobs - это хорошая вещь, очень полезная и простая для многих целей, но, поскольку вы описываете свои потребности, я думаю, что они могут вызвать больше сложностей, чем ониделай доброВот некоторые вещи, которые следует учитывать:
что произойдет, если рабочие места пересекаются?один занимает больше времени, чем одна минута?Есть ли общие ресурсы / тупики / временные файлы?- самый распространенный метод - использовать файл блокировки и остановить выполнение, если оно занято в самом начале программы.но программа также должна искать дальнейшую работу прямо перед ее завершением.- это, однако, может также усложниться на машинах с Windows, потому что они AFAIK не поддерживают блокировки записи из коробки
cronjobs - трудная задача для поддержки.если вы хотите отслеживать их, вы должны реализовать дополнительную логику, такую как проверка, когда программа последний раз запускаласьоднако это может быть затруднено, если ваша программа должна запускаться только по требованию.лучшим способом было бы использовать какое-то поле «задание выполнено» в базе данных или удалить строки, которые были обработаны.
в большинстве систем на основе Unix cronjobs теперь довольно стабильны, но естьмного ситуаций, где вы можете сломать свою систему cronjob.большинство из них основаны на человеческой ошибке.например, системный администратор, не выходящий из редактора crontab должным образом в режиме редактирования, может привести к удалению всех cronjobs.Многие компании также не имеют надлежащей системы мониторинга по причинам, указанным выше, и уведомляют, как только их услуги испытывают проблемы.в этот момент часто никто не записал / не поставил под контроль версий, какие cronjobs должны запускаться, и начинаются дикие предположения и работы по реконструкции.
поддержка cronjob может быть еще более сложной, когда используются внешние инструменты исреда не является родной системой Unix.Системные администраторы должны получить знания о большем количестве программ, и они могут иметь потенциальные ошибки.
Честно говоря, я думаю, что это всего лишь небольшой скрипт, который вы запускаете из консоли и позволяете открывать - это нормально.
<?php
while(true) {
$job = fetch_from_db();
if(!$job) {
sleep(10)
} else {
$job->process();
}
}
вы также можете прикасаться к файлу (изменять метку времени изменения) в каждом цикле, и вы можете написать скрипт nagios, который проверяет устаревание этой метки времени, чтобы вы знали, что ваша работа все еще выполняется ...
если вы хотите, чтобы он запускался с системой, я рекомендую deamon.
ps: в компании, в которой я работаю, есть много фоновой активности для нашего сайта (ползать, обновлять процессы, вычисления и т. д ...) и cronjobs были настоящим беспорядком, когда я начал там.их распределяли по разным серверам, отвечающим за разные задачи.базы данных были доступны через Интернет.Тонны файловых систем NFS, общих ресурсов Samba и т. д. были доступны для обмена ресурсами.место было полно точек неудач, узких мест и чего-то, что постоянно ломалось.было задействовано так много технологий, что поддерживать их было очень сложно, а когда что-то не работало, требовались часы, чтобы отследить проблему, и еще один час того, что эта часть даже должна была сделать.
теперь у нас есть единое целоеОбновите программу, которая отвечает буквально за все, она работает на нескольких серверах, и у них есть файл конфигурации, который определяет задания для запуска.Каждое сообщение отправляется из одного родительского процесса, выполняющего бесконечный цикл.его легко контролировать, настраивать, синхронизировать и все идет гладко.это избыточно, оно синхронизировано и гранулярность в порядке.поэтому он работает параллельно, и мы можем масштабировать до любого количества серверов.
Я действительно предлагаю сесть достаточно времени, подумать обо всем в целом и получить представление о полной системе.затем потратьте время и силы на внедрение решения, которое будет хорошо работать в будущем и не распространит тонны различных программ по всей вашей системе.
pps:
Я много читал о минимальном интервале в 1/5 минуты для cronjobs / tasks. Вы можете легко обойти это с произвольным сценарием, который принимает этот интервал:
// run every 5 minutes = 300 secs
// desired interval: 30 secs
$runs = 300/30; // be aware that the parent interval needs to be a multiple of the desired interval
for($i=0;$i<$runs;$i++) {
$start = time();
system('myscript.php');
sleep(300/10-time()+$start); // compensate the time that the script needed to run. be aware that you have to implement some logic to deal with cases where the script takes longer to run than your interavl - technique and problem described above
}