PHP: Как использовать cron (или другой метод), чтобы каждый раз запускать скрипт PHP?

Если у меня есть задание cron, которое запускается каждую минуту, и первые итерации выполняются в течение 62 секунд, будет ли вторая итерация запускаться до тех пор, пока не закончится первая ошибка, или может случиться, что одно и то же задание cron работает одновременно?

Чтобы проиллюстрировать это, см. Сценарий 1:

|0 |60 |120 |180 |240 |300 ------ Cron Job 1 Taking 60 Seconds --------- Cron Job 2 Taking 90 Seconds ------ Cron Job 3 Taking 90 Seconds but overlapping with the previous cron job 

Является выше, что произойдет, или произойдет сценарий 2:

 |0 |60 |120 |180 |240 |300 ------ Cron Job 1 Taking 60 Seconds --------- Cron Job 2 Taking 90 Seconds XXX-------Cron Job 3 waiting til the next 1 minute interval starts 

Моя забота заключается в том, что на 30 секунд будет отмечен XXX, где будет выполняться NO CNON.

Что я пытаюсь сделать? Я хочу выполнять PHP-скрипт каждую секунду, бесконечно. Он не должен запускаться один раз в секунду, но он должен RUN, END, RUN, END, RUN, END. Если итерация занимает 5 секунд, она должна запускаться только после первого завершения. Но он никогда не должен останавливаться. Проблема в том, что я не могу определить длину итерации. Одна итерация может занять 1 секунду, или это может занять 5 секунд или даже больше.

  1. Может ли cron сделать это? Чтобы я мог быть уверен, что сценарий будет запускаться каждую секунду независимо от того, что?
  2. Если нет, как я могу gaurentee, чтобы PHP-скрипт выполнялся неограниченно, одна итерация за другой?

Related of "PHP: Как использовать cron (или другой метод), чтобы каждый раз запускать скрипт PHP?"

Вы можете реализовать простой механизм блокировки, как следует.

 if(!locked()) { lock(); // your code here unlock(); } else { echo "script already running"; } function lock() { file_put_contents("write.lock", 'running'); } function locked() { return file_exists("write.lock"); } function unlock() { return unlink("write.lock"); } 

Да. cron запускает задание, но не проверяет, был ли ранее запущен. Это не управление очередью заданий.

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

будет ли вторая итерация запущена до тех пор, пока не закончится первое появление?

С Vixie cron, который по умолчанию используется для большинства Unix, ответ «да».

как я могу получить истинные интервалы в секунду в Linux-системе, которая выполняет PHP-скрипт?

Вопрос странный, пожалуйста, переформулируйте. Но если вы хотите, чтобы один экземпляр каждого скрипта работал одновременно, используйте / usr / bin / flock или любой другой инструмент mutex.

Я закончил с помощью supervisord, который решил все мои проблемы.

Вместо использования cron вы можете заглянуть в «демонтаж» вашего скрипта: Daemon системы PEAR

Оттуда, похоже, вам понадобится создать простую задачу / очередь задач / рабочих и использовать демон для отправки и блокировки соответственно.