Как сделать добавление записи в базу данных по таймеру?

206
17 марта 2018, 15:38

Нужен файл, который будет добавлять в таблицу запись по таймеру. Так вот, каким образом можно это сделать? Знаю, что для этого можно использовать CronTab. В mysql и PHP особо не силен.

Answer 1

Вы можете сделать примерно следующее:

  1. Настроить системный cron вашего сервера на вызов некого скрипта, например cron.php
  2. Внутри скрипта cron.php проверить текущее время и выполнить все необходимые действия

Можно поступить немного иначе, определить интервалы в самом cron, а в скрипте PHP лишь выполнять определенные действия, связанные с конкретными интервалами. Я решил задачу периодического сбора погоды по филиалам (через каждые 3 часа) и ежемесячного расчета начислений (в начале каждого месяца) и написал что-то вроде этого:

<?php
require_once("include/include.inc.php");
if (!api_RunningInCli()) {
    die('Script must be called only from CLI, exited');
}
if ($argc <= 1) {
    die('No parameters, exited');
}
if ($argc > 1 && isset($argv[1])) {
    $period = trim($argv[1]);
    switch ($period) {
        case 'hourly':
            Cron::Hourly();
            break;
        case 'daily':
            Cron::Daily();
            break;
        case 'weekly':
            Cron::Weekly();
            break;
        case 'monthly':
            Cron::Monthly();
            break;
    }
}
?>

В пользовательском классе Cron статически определены периоды в виде методов, внутри - произвольные действия.

Обратите внимание на то, что скрипт cron.php ожидает в параметре указания периода, в моем случае это строки hourly/daily/weekly/monthly, поставьте свою строку и свой период, если нужно.

Функция api_RunningInCli() защищает скрипт от вызова через браузер, полезно в случае, если это возможно, определена довольно просто:

/* Возвращает true, если скрипт запущен из консоли */
function api_RunningInCli()
{
    return PHP_SAPI == 'cli' || (!isset($_SERVER['DOCUMENT_ROOT']) && !isset($_SERVER['REQUEST_URI']));
}

На оригинальность даже не претендую.

Системный cron в данном случае настроим на периоды и параметр. Содержимое crontab -l может быть примерно таким:

0 * * * * /path/cron.sh hourly > /dev/null 2>&1
0 0 * * * /path/cron.sh daily > /dev/null 2>&1
0 0 * * 1 /path/cron.sh weekly > /dev/null 2>&1
0 0 1 * * /path/cron.sh monthly > /dev/null 2>&1

Хорошо видно настройку периодов cron, абсолютный путь до скрипта SHELL и параметр скрипта. Отдельный скрипт SHELL делать не обязательно, внутри него все крайне просто:

#!/bin/bash
cd /var/www/html
php ./cron.php $1

Я сделал скрипт SHELL для того, чтобы было удобно переносить cron.php и вызывать сразу несколько подобных cron.php для всех проектов на одном сервере. Можете от него отказаться без всяких проблем и писать что-то вроде

0 * * * * php /var/www/html/cron.php hourly > /dev/null 2>&1

в crontab.

Answer 2

Разобрался сам. Запускаю cron.php /usr/bin/wget -O /dev/null http://site.ru/cron/cron.php. Создал два файла - cron.php и config.php. config.php - файл конфигурации, cron.php - исполняющий указанный код.

READ ALSO
Множественный binding в Margin

Множественный binding в Margin

Пользователям из интерфейса предлагается выбрать отступы для окна:

204
Запуск анимации из фонового потока(2)

Запуск анимации из фонового потока(2)

Благодаря VladD, который ответил мне в прошлый раз здесь - Проигрывание анимации из фонового потока , а также куче различных тем на других форумах,...

222
Использование Firebase в c#

Использование Firebase в c#

Как можно моментально отправлять данные в FireBase?

233