mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-07-09 01:44:25 +03:00
140 lines
3.7 KiB
PHP
140 lines
3.7 KiB
PHP
<?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");
|
||
|
||
/**
|
||
* Абстрактный слой работы с крон-процессами
|
||
*/
|
||
class Cron extends Object {
|
||
/**
|
||
* @var Engine
|
||
*/
|
||
protected $oEngine=null;
|
||
/**
|
||
* Дескриптор блокирующего файла
|
||
*
|
||
* @var string
|
||
*/
|
||
protected $oLockFile=null;
|
||
/**
|
||
* Имя процесса, под которым будут помечены все сообщения в логах
|
||
*
|
||
* @var string
|
||
*/
|
||
protected $sProcessName;
|
||
|
||
public function __construct($sLockFile=null) {
|
||
$this->sProcessName=get_class($this);
|
||
$this->oEngine=Engine::getInstance();
|
||
/**
|
||
* Инициализируем ядро
|
||
*/
|
||
$this->oEngine->Init();
|
||
|
||
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
|
||
* @return
|
||
*/
|
||
public function Log($sMsg) {
|
||
if (Config::Get('sys.logs.cron')) {
|
||
$sMsg=$this->sProcessName.': '.$sMsg;
|
||
$this->oEngine->Logger_Notice($sMsg);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Проверяет уникальность создаваемого процесса
|
||
*/
|
||
public function isLock() {
|
||
return ($this->oLockFile && !flock($this->oLockFile, LOCK_EX|LOCK_NB));
|
||
}
|
||
/**
|
||
* Снимает блокировку на повторный процесс
|
||
*/
|
||
public function unsetLock() {
|
||
return ($this->oLockFile && @flock($this->oLockFile, LOCK_UN));
|
||
}
|
||
|
||
/**
|
||
* Основная функция слоя. Реализует логику работы
|
||
* крон процесса с последующей передачей управления
|
||
* на пользовательскую функцию
|
||
*
|
||
* @param ( string|array ) $sFunction
|
||
* @param array $aArgs
|
||
*/
|
||
public function Exec() {
|
||
/**
|
||
* Если выполнение процесса заблокирован, завершаемся
|
||
*/
|
||
if($this->isLock()) {
|
||
throw new Exception('Try to exec already run process');
|
||
}
|
||
/**
|
||
* Здесь мы реализуем дополнительную логику:
|
||
* логирование вызова, обработка ошибок,
|
||
* буферизация вывода.
|
||
*/
|
||
ob_start();
|
||
$this->Client();
|
||
/**
|
||
* Получаем весь вывод функции.
|
||
*/
|
||
$sContent=ob_get_contents();
|
||
ob_end_clean();
|
||
|
||
return $sContent;
|
||
}
|
||
|
||
/**
|
||
* Здесь будет реализована логика завершения работы cron-процесса
|
||
*/
|
||
public function Shutdown() {
|
||
$this->unsetLock();
|
||
$this->Log('Cron process ended');
|
||
}
|
||
|
||
public function __destruct() {
|
||
$this->Shutdown();
|
||
}
|
||
/**
|
||
* Клиентская функция будет переопределятся в наследниках класса
|
||
* для обеспечивания выполнения основного функционала.
|
||
*/
|
||
public function Client(){
|
||
throw new Exception('Call undefined client function');
|
||
}
|
||
|
||
public function __call($sName,$aArgs) {
|
||
return $this->oEngine->_CallModule($sName,$aArgs);
|
||
}
|
||
}
|
||
?>
|