Как запустить Cronjobs чаще, чем раз в минуту?

Я создал таблицу базы данных по электронной почте. Я буду вставлять все письма, которые нужно отправить моему приложению PHP в эту таблицу.

Другой скрипт PHP будет искать все неотправленные электронные письма и отправляет их.

Я запускаю этот скрипт с помощью cronjobs. К сожалению, cronjobs может работать только максимум один раз в минуту. Поэтому в худшем случае пользователю нужно подождать одну минуту, пока его электронная почта действительно не будет отправлена.

Моя текущая идея обходного пути вызывает сценарий с дополнительным параметром сна и дублирование cronjobs.

Пример:

* * * * * curl emails.php?sleep=0 >/dev/null 2>&1 * * * * * curl emails.php?sleep=10 >/dev/null 2>&1 * * * * * curl emails.php?sleep=20 >/dev/null 2>&1 * * * * * curl emails.php?sleep=30 >/dev/null 2>&1 * * * * * curl emails.php?sleep=40 >/dev/null 2>&1 * * * * * curl emails.php?sleep=50 >/dev/null 2>&1 

В приведенном выше примере скрипт запускается каждые 10 секунд. Первая строка скрипта emails.php будет:

 sleep($_REQUEST['sleep']); 

Solutions Collecting From Web of "Как запустить Cronjobs чаще, чем раз в минуту?"

Для начала я бы рекомендовал использовать версию командной строки PHP вместо использования curl для вызова сценария. Затем вы можете создать PHP-скрипт с разумной продолжительностью жизни, который не ограничивается необходимостью выдавать ответ в течение заданного периода времени.

Таким образом, вы можете просто спать / проверять электронную почту / передачу / сон и т. Д. В PHP-скрипте, а не просто использовать cron.

Кроме того, я бы позаботился о том, чтобы несколько сценариев PHP не работали в таблице базы данных одновременно, либо с помощью подхода pid-файла или базы данных (если данный файл / параметр существует / установлен, выполняется прерывание ) или путем разумного выбора времени выполнения cron и ограничения максимального времени обработки скрипта, проверяя, как долго он работает до начала «проверки на электронные письма» части цикла.

Вот простой сценарий bash, который я написал, который может использоваться с crontab для запуска чаще, чем 1 минута.

вы можете сохранить его как ~ / bin / runEvery.sh, а затем в crontab напишите что-то вроде этого, чтобы запустить otherScript.sh каждые 5 секунд:

*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh

Это сценарий:

 #!/bin/bash inputPeriod=$1 runCommand=$2 RUN_TIME=60 error="no" if [ 'x'"$runCommand" != 'x' ] then if [ 'x'$inputPeriod != 'x' ] then loops=$(( $RUN_TIME / $inputPeriod )) if [ $loops -eq 0 ] then loops=1 fi for i in $(eval echo {1..$loops}) do $runCommand sleep $inputPeriod done else error="yes" fi else error="yes" fi if [ $error = "yes" ] then echo "runEvery - runs a command every X seconds for a minute" echo "Usage: runEvery.sh <# in seconds < 60> <command to run>" fi 

Это нужно сделать на уровне скрипта.

 // cron.php running every 10 seconds // you need to setup this cron run every minute using `crontab` of cPanel etc <?php $expireTime = time() + 60; while (time() < $expireTime) { // my php logic here sleep(10); // sleep for 10 seconds // you may change the sleep time to change frequency } 

Если вы делаете это каждые 10 секунд, cron – это не лучший инструмент для работы. Вам нужен сценарий, который работает непрерывно, как показано Ишем.

Вы можете зарегистрировать скрипт как услугу, поставив соответствующий сценарий запуска / остановки в /etc/init.d и включив его.

Или, если у вас есть только учетная запись пользователя, вы можете запустить ее на сеансе экрана. Тогда вы можете даже посмотреть выход для диагностики ошибок.