1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-01 05:55:02 +03:00
ifhub.club/framework/classes/engine/Cron.class.php

156 lines
4.7 KiB
PHP
Raw Normal View History

2009-09-10 02:10:30 +03:00
<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
require_once("Engine.class.php");
/**
* Абстрактный класс для работы с крон-процессами.
* Например, его использует отложенная рассылка почтовых уведомлений для пользователей.
* Обработчик крона не запускается автоматически(!!), его необходимо добавлять в системный крон (nix*: crontab -e)
*
* @package engine
* @since 1.0
2009-09-10 02:10:30 +03:00
*/
class Cron extends LsObject {
2009-09-10 02:10:30 +03:00
/**
* Объект ядра
*
2009-09-10 02:10:30 +03:00
* @var Engine
*/
protected $oEngine=null;
/**
* Дескриптор блокирующего файла
* Если этот файл существует, то крон не запустится повторно.
2009-09-10 02:10:30 +03:00
*
* @var string
2009-09-10 02:10:30 +03:00
*/
protected $oLockFile=null;
2009-09-10 02:10:30 +03:00
/**
* Имя процесса, под которым будут помечены все сообщения в логах
2009-09-10 02:10:30 +03:00
*
* @var string
*/
2011-04-27 10:44:28 +03:00
protected $sProcessName;
/**
* @param string|null $sLockFile Полный путь до лок файла, например <pre>Config::Get('sys.cache.dir').'notify.lock'</pre>
*/
2009-09-10 02:10:30 +03:00
public function __construct($sLockFile=null) {
2011-04-27 10:44:28 +03:00
$this->sProcessName=get_class($this);
2009-09-10 02:10:30 +03:00
$this->oEngine=Engine::getInstance();
2010-05-18 15:32:28 +03:00
/**
* Инициализируем ядро
*/
$this->oEngine->Init();
2009-09-10 02:10:30 +03:00
if(!empty($sLockFile)) {
$this->oLockFile=fopen($sLockFile,'a');
}
/**
* Инициализируем лог и делает пометку о старте процесса
*/
$this->oEngine->Logger_SetFileName(Config::Get('sys.logs.cron_file'));
$this->Log('Cron process started');
}
/**
* Делает запись в лог
*
* @param string $sMsg Сообщение для записи в лог
*/
public function Log($sMsg) {
2011-04-27 10:44:28 +03:00
if (Config::Get('sys.logs.cron')) {
$sMsg=$this->sProcessName.': '.$sMsg;
$this->oEngine->Logger_Notice($sMsg);
}
2009-09-10 02:10:30 +03:00
}
/**
* Проверяет уникальность создаваемого процесса
*
* @return bool
2009-09-10 02:10:30 +03:00
*/
public function isLock() {
2009-09-20 15:47:54 +03:00
return ($this->oLockFile && !flock($this->oLockFile, LOCK_EX|LOCK_NB));
2009-09-10 02:10:30 +03:00
}
/**
* Снимает блокировку на повторный процесс
*
* @return bool
2009-09-10 02:10:30 +03:00
*/
public function unsetLock() {
return ($this->oLockFile && @flock($this->oLockFile, LOCK_UN));
}
/**
* Основной метод крон-процесса.
* Реализует логику работы крон процесса с последующей передачей управления на пользовательскую функцию
2009-09-10 02:10:30 +03:00
*
* @return string
2009-09-10 02:10:30 +03:00
*/
public function Exec() {
2009-09-10 02:10:30 +03:00
/**
* Если выполнение процесса заблокирован, завершаемся
*/
if($this->isLock()) {
throw new Exception('Try to exec already run process');
2009-09-10 02:10:30 +03:00
}
/**
* Здесь мы реализуем дополнительную логику:
* логирование вызова, обработка ошибок,
* буферизация вывода.
*/
ob_start();
$this->Client();
2009-09-10 02:10:30 +03:00
/**
* Получаем весь вывод функции.
*/
$sContent=ob_get_contents();
ob_end_clean();
return $sContent;
2009-09-10 02:10:30 +03:00
}
/**
* Завершение крон-процесса
2009-09-10 02:10:30 +03:00
*/
public function Shutdown() {
$this->unsetLock();
$this->Log('Cron process ended');
2009-09-10 02:10:30 +03:00
}
/**
* Вызывается при уничтожении объекта
*/
2009-09-10 02:10:30 +03:00
public function __destruct() {
$this->Shutdown();
}
/**
* Клиентская функция будет переопределятся в наследниках класса
* для обеспечивания выполнения основного функционала.
*/
public function Client(){
throw new Exception('Call undefined client function');
2009-09-10 02:10:30 +03:00
}
/**
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
* @see Engine::_CallModule
*
* @param string $sName Имя метода
* @param array $aArgs Аргументы
* @return mixed
*/
2011-04-27 10:44:28 +03:00
public function __call($sName,$aArgs) {
return $this->oEngine->_CallModule($sName,$aArgs);
}
2009-09-10 02:10:30 +03:00
}
?>