Как запустить 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 секунд. Первая строка письма.PHP-скрипт такой:

sleep($_REQUEST['sleep']);

4 ответов


для начала я бы рекомендовал использовать версию командной строки 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=
runCommand=
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

<?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-это просто не правильный инструмент для работы. Вам нужен сценарий, который работает непрерывно, как показано Ish.

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

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