Псевдо крон в PHP

В отсутствии планировщика задач Cron (на старых хостингах или не имея доступ в панель управления хостинга) часто возникает необходимость периодически выполнять сервисные скрипты (обновление цен, удаление временных файлов и т.д.).

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

Самый простой вариант – запускать скрипт при любом посещении сайта. Чтобы снизить нагрузку, можно запускать скрипт случайным образом, например при выпадении определенного числа из диапазона чисел.

if (mt_rand(1, 10) == 5) {
	// PHP-скрипт...
	echo 'Run';
}
PHP

Продолжение первого варианта, только код будет выполнятся в определенный интервал времени, например ночью 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';
	}
}
PHP

Чтобы выполнять код с определенной периодичностью нужно где-то хранить дату последнего запуска, возможен вариант хранения в файле или в базе данных.

Например, данные примеры будет выполнятся один раз в шесть часов:

Хранение в файле

$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';
	}
}
PHP

Хранение в базе данных

Для хранения данных понадобится таблица `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);
SQL
$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';
}
PHP
22.12.2022
499

Комментарии

, чтобы добавить комментарий.

Другие публикации

Получить фото из Instagram без API
Так как Instagram и Fasebook ограничили доступ к API, а фото с открытого аккаунта всё же нужно периодически получать и...
22536
+7
Автоматическое сжатие и оптимизация картинок на сайте
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
20718
+7
Как сформировать большой файл для маркета
На сайте интернет-магазина с большим количеством товаров (от 8000) возникает проблема с формированием XML-фида для...
2655
+3
Примеры использования PDO MySQL
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
85293
+3
Формирование файла sitemap.xml
Пример создания файла карты сайта (sitemap.xml) на PHP. Интеграция его на сайт и подключение его в robots.txt
19029
+3
Шорткоды на регулярных выражениях
Часто на сайтах возникает необходимость вставлять в тексты страниц динамичные информационные блоки – баннеры, телефоны...
4666
+3