В отсутствии планировщика задач Cron (на старых хостингах или не имея доступ в панель управления хостинга) часто возникает необходимость периодически выполнять сервисные скрипты (обновление цен, удаление временных файлов и т.д.).
Так как на сайте постоянно присутствует трафик (пользователи и поисковые роботы), то сервисные скрипты можно запускать периодически. Минусом такого решения является замедление работы сайта у некоторых пользователей.
Самый простой вариант – запускать скрипт при любом посещении сайта. Чтобы снизить нагрузку, можно запускать скрипт случайным образом, например при выпадении определенного числа из диапазона чисел.
Продолжение первого варианта, только код будет выполнятся в определенный интервал времени, например ночью c 1:00 до 6:00.
if (mt_rand(1, 10) == 5) {
$start = new DateTime('today 01:00');
$end = new DateTime('today 06:00');
$now = new DateTime();
if ($now >= $start && $now <= $end) {
// PHP-скрипт...
echo 'Run';
}
}
Чтобы выполнять код с определенной периодичностью нужно где-то хранить дату последнего запуска, возможен вариант хранения в файле или в базе данных.
Например, данные примеры будет выполнятся один раз в шесть часов:
Хранение в файле
$interval = 21600; // 6 часов
$tmpfile = __DIR__ . '/cron_time.tmp';
if (!is_file($tmpfile)) {
file_put_contents($tmpfile, time());
} else {
$last = file_get_contents($tmpfile);
if ($last + $interval < time()) {
file_put_contents($tmpfile, time());
// PHP-скрипт...
echo 'Run';
}
}
Хранение в базе данных
Для хранения данных понадобится таблица `cron` одной записью id=1:
CREATE TABLE `cron` (
`id` int(10) UNSIGNED NOT NULL,
`date_add` int(11) UNSIGNED NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `cron` (`id`, `date_add`) VALUES
(1, 1671636219);
$dbh = new PDO('mysql:dbname=db_name;host=localhost', 'логин', 'пароль');
$sth = $dbh->prepare("SELECT * FROM `cron` WHERE `id` = 1");
$data = $sth->fetch(PDO::FETCH_ASSOC);
if ($data['date_add'] + 21600 < time()) {
$sth = $dbh->prepare("UPDATE `cron` SET `date_add` = ? WHERE `id` = 1");
$sth->execute(array(time()));
// PHP-скрипт...
echo 'Run';
}