Как запустить 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 и включив его.

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