Как запустить Cronjobs чаще, чем раз в минуту?
Я создал таблицу базы данных по электронной почте. Я буду вставлять все письма, которые нужно отправить моему приложению PHP в эту таблицу.
Другой PHP script будет искать все неотправленные письма и отправляет их.
Я запускаю этот script с помощью cronjobs. К сожалению, cronjobs может работать только максимум один раз в минуту.
Поэтому в худшем случае пользователю нужно подождать одну минуту, пока его электронная почта действительно не будет отправлена.
Моя текущая идея обходного пути вызывает script с дополнительным параметром сна и дублированием 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
В приведенном выше примере script будет выполняться каждые 10 секунд. Первая строка emails.PHP скрипт будет выглядеть следующим образом:
sleep($_REQUEST['sleep']);
Ответы
Ответ 1
Для начала я бы рекомендовал использовать версию командной строки PHP вместо использования curl для вызова script. Затем вы можете создать PHP скрипт с разумной продолжительностью жизни, которая не ограничена необходимостью выдавать ответ в течение заданного периода времени.
Таким образом, вы можете просто спать/проверять электронную почту/передачу/сон и т.д. в PHP script, а не на использование cron.
Кроме того, я позабочусь о том, чтобы несколько скриптов PHP не работали в таблице базы данных одновременно, либо с помощью подхода pid файла или базы данных (если заданный файл/параметр существует/установлен, прервать обработку) или путем разумного выбора времени выполнения cron и ограничения максимального времени обработки script, проверяя, сколько времени оно выполнялось до начала части проверки цикла "проверка для электронной почты".
Ответ 2
Вот простой bash script, который я написал, который можно использовать с crontab для запуска чаще, чем 1 минута.
вы можете сохранить его как ~/bin/runEvery.sh
а затем в crontab напишите что-нибудь подобное, чтобы запустить otherScript.sh каждые 5 секунд:
*/1 * * * * ~/bin/runEvery.sh 5 otherScript.sh
Это script:
#!/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
Ответ 3
Это нужно сделать на уровне script.
// 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
}
Ответ 4
Если вы делаете это каждые 10 секунд, cron - это не лучший инструмент для работы. Вам понадобится script, который работает непрерывно, как показано Ish.
Вы можете зарегистрировать script как услугу, поставив соответствующий старт/стоп script в /etc/init.d и включив его.
Или, если у вас есть только учетная запись пользователя, вы можете запустить ее в сеансе экрана. Затем вы можете даже смотреть вывод для диагностики ошибок.