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


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

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

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

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

Пример:

* * * * * 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']);
Author: hakre, 2011-01-12

4 answers

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

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

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

 9
Author: John Parker, 2011-01-12 18:29:11

Вот простой скрипт 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
 14
Author: shlomia, 2013-06-16 11:47:52

Это должно быть сделано на уровне сценария.

// cron.php running every 10 seconds

<?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
}
 11
Author: Ish, 2018-05-22 19:57:22

Если вы делаете это каждые 10 секунд, cron просто не подходит для этой работы. Что вам нужно, так это скрипт, который работает непрерывно, как показано в Ish.

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

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

 1
Author: ypnos, 2011-01-12 18:34:54