Как мне создать одноразовые запланированные задачи в PHP?Cron? - PullRequest
3 голосов
/ 12 сентября 2011

Я создаю веб-приложение, в котором пользователи могут указать время и дату для запуска 2 запланированных задач (одна на дату начала и одна на дату окончания).Поскольку они запускаются только один раз, я не знал, будет ли уместной работа cron.

Другой вариант, о котором я подумал, - это сохранить все времена задач в БД и запускать задание cron каждый час, чтобы проверить, если $usertime == NOW() и т. Д. Но я беспокоился о перекрытии заданий и т. Д.

Мысли?

Дополнительно: Многие пользователи могут создавать множество задач, каждый из которых запускает 2 сценария.

Ответы [ 3 ]

1 голос
/ 13 сентября 2011

Какой бы механизм вы ни выбрали (cron / at / daemon), я бы поставил только стартовое задание в очередь. Наряду с этим стартовой задачей является размещение конечной задачи. Эта часть может либо поместить его в будущее, либо по прошествии времени немедленно начать его. Таким образом, они никогда не будут пересекаться.

Я также предпочел бы вариант PHP / DB и cron. Кажется проще и дает больше гибкости - может выбрать несколько потоков и т. Д., Если диктует производительность.

1 голос
/ 11 августа 2014

cron отлично подходит для сценариев, запускаемых на регулярной основе, но если вы хотите, чтобы одноразовый (или два) сценарий запускался в определенное время, вы должны использовать команду unix 'at', и вы можете это сделать прямо из php, используя такой код:

/****
 * Schedule a command using the AT command
 *
 * To do this you need to ensure that the www-data user is allowed to
 * use the 'at' command - check this in /etc/at.deny
 *
 *
 * EXAMPLE USAGE ::
 *
 * scriptat( '/usr/bin/command-to-execute', 'time-to-run');
 * The time-to-run shoud be in this format: strftime("%Y%m%d%H%M", $unixtime)
 *
 **/

function scriptat( $cmd = null, $time = null ) {
    // Both parameters are required
    if (!$cmd) {
        error_log("******* ScriptAt: cmd not specified");
        return false;
    }
    if (!$time) {
        error_log("******* ScriptAt: time not specified");
        return false;
    }

    // We need to locate php (executable)
    if (!file_exists("/usr/bin/php")) {
        error_log("~ ScriptAt: Could not locate /usr/bin/php");
        return false;
    }

    $fullcmd = "/usr/bin/php -f $cmd";

    $r = popen("/usr/bin/at $time", "w");
    if (!$r) {
        error_log("~ ScriptAt: unable to open pipe for AT command");
        return false;
    }
    fwrite($r, $fullcmd);
    pclose($r);

    error_log("~ ScriptAt: cmd=${cmd} time=${time}");

    return true;
}
1 голос
/ 12 сентября 2011

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

Вы можете запускать cronjob проверки / инициации каждую минуту. Просто убедитесь, что проверочный код не слишком тяжелый (быстро выходит). Запрос к базе данных для пары строк не должен быть проблемой для выполнения каждую минуту.

Если «задача» действительно тяжелая, вы должны рассмотреть демон вместо cronjob, вызывающего php. Вот хорошее и простое для чтения введение: Создание демонов в PHP


Редактировать: Я считал само собой разумеющимся, что даже если задачи выполняются только «один раз», у вас есть несколько пользователей, которые равны 1: 1 «один раз», таким образом, задания для каждого пользователя. Если нет, то at (как говорится в комментариях) выглядит достойно эксперимента.

...