Аналог CRON на PHP
11.02.2022 06:16:46 pm
Здравствуйте. Хочу сделать свой CRON на чистом PHP, чтобы выполнялись определенные скрипты, без крона сервера.
Я знаю, что такое можно сделать, где-то читал, как это делается, но, сейчас не могу найти ту статью...
Помогите с реализацией Крона на PHP, пожалуйста.
Спасибо.
Я знаю, что такое можно сделать, где-то читал, как это делается, но, сейчас не могу найти ту статью...
Помогите с реализацией Крона на PHP, пожалуйста.
Спасибо.
- Жалоба
12.02.2022 09:19:49 am
У меня движок не использует серверный Крон, для этого разработчики движка написали класс "phpfox_cron". Крон движка работает за счет посещений сайта людьми или ботами. При каждом обращении к сайту, сценарий проверяет таблицу "phpfox_cron", сравнивает поля время последнего выполнения установленной задачи и период выполнения (30 минут, 1 час, день, сутки, неделя, месяц, и так далее). Если сравнение возвращает время с момента последнего выполнения задачи больше, чем установленный период, то Крон выполнит задачу, и обновит время последнего выполнения.
Надеюсь, объяснил понятно.
Надеюсь, объяснил понятно.
12.02.2022 12:18:54 pm
Если Вам в качестве примера, то вот:
И таблица:

<?php
class phpfox_cron
{
private $crons = [];
private $cache = null;
public function __construct()
{
$this->cache = phpfox::getLib('cache');
$cacheId = $this->cache->set('cron');
if (!($this->crons = $this->cache->get($cacheId)))
{
$rows = phpfox::getLib('database')
->select('cron.*')
->from(phpfox::getT('cron'), 'cron')
->join(phpfox::getT('product'), 'product', 'product.product_id = cron.product_id AND product.is_active = 1')
->join(phpfox::getT('module'), 'm', 'm.module_id = cron.module_id AND m.is_active = 1')
->where('cron.is_active = 1')
->execute('getSlaveRows');
foreach ($rows as $row)
{
$this->crons[$row['cron_id']] = $row;
}
$this->cache->save($cacheId, $this->crons);
}
}
public function exec($id = null)
{
if (is_bool($this->crons))
{
return false;
}
if ($id && isset($this->crons[$id]))
{
eval($this->crons[$id]['php_code']);
$this->_update($this->crons[$id]['cron_id'], $this->_getNextRun($this->crons[$id]['type_id'], $this->crons[$id]['every']));
}
else
{
foreach ($this->crons as $cron)
{
if ($cron['next_run'] < PHPFOX_TIME)
{
eval($cron['php_code']);
$this->_update($cron['cron_id'], $this->_getNextRun($cron['type_id'], $cron['every']));
}
}
}
}
// Через какое время выполнять задание Cron
// (1: Минуты) (2: Часы) (3: Дни) (4: Месяца) (5: Годы)
private function _getNextRun($type, $every)
{
switch ($type)
{
case 1: // Минуты
$time = ($every * CRON_ONE_MINUTE);
break;
case 2: // Часы
$time = ($every * CRON_ONE_HOUR);
break;
case 3: // Дни
$time = ($every * CRON_ONE_DAY);
break;
case 4: // Месяца
$time = ($every * CRON_ONE_MONTH);
break;
case 5: // Годы
$time = ($every * CRON_ONE_YEA);
break;
}
return ($time + PHPFOX_TIME);
}
private function _update($id, $time)
{
phpfox::getLib('database')->update(phpfox::getT('cron'), [
'next_run' => $time,
'last_run' => PHPFOX_TIME
], 'cron_id = ' . (int) $id
);
$this->cache->remove('cron');
}
}
И таблица:
