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");
|
|
|
|
|
|
|
|
|
|
/**
|
2012-04-17 20:58:32 +03:00
|
|
|
|
* Абстрактный класс для работы с крон-процессами.
|
|
|
|
|
* Например, его использует отложенная рассылка почтовых уведомлений для пользователей.
|
|
|
|
|
* Обработчик крона не запускается автоматически(!!), его необходимо добавлять в системный крон (nix*: crontab -e)
|
|
|
|
|
*
|
|
|
|
|
* @package engine
|
|
|
|
|
* @since 1.0
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*/
|
2012-04-07 09:41:52 +03:00
|
|
|
|
class Cron extends LsObject {
|
2009-09-10 02:10:30 +03:00
|
|
|
|
/**
|
2012-04-17 20:58:32 +03:00
|
|
|
|
* Объект ядра
|
|
|
|
|
*
|
2009-09-10 02:10:30 +03:00
|
|
|
|
* @var Engine
|
|
|
|
|
*/
|
|
|
|
|
protected $oEngine=null;
|
|
|
|
|
/**
|
2009-09-11 15:13:53 +03:00
|
|
|
|
* Дескриптор блокирующего файла
|
2012-04-17 20:58:32 +03:00
|
|
|
|
* Если этот файл существует, то крон не запустится повторно.
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*
|
2009-09-11 15:13:53 +03:00
|
|
|
|
* @var string
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*/
|
2009-09-11 15:13:53 +03:00
|
|
|
|
protected $oLockFile=null;
|
2009-09-10 02:10:30 +03:00
|
|
|
|
/**
|
2009-09-11 15:13:53 +03:00
|
|
|
|
* Имя процесса, под которым будут помечены все сообщения в логах
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
2011-04-27 10:44:28 +03:00
|
|
|
|
protected $sProcessName;
|
2012-04-17 20:58:32 +03:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @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');
|
|
|
|
|
}
|
2009-09-11 15:13:53 +03:00
|
|
|
|
/**
|
|
|
|
|
* Инициализируем лог и делает пометку о старте процесса
|
|
|
|
|
*/
|
|
|
|
|
$this->oEngine->Logger_SetFileName(Config::Get('sys.logs.cron_file'));
|
|
|
|
|
$this->Log('Cron process started');
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Делает запись в лог
|
|
|
|
|
*
|
2012-04-17 20:58:32 +03:00
|
|
|
|
* @param string $sMsg Сообщение для записи в лог
|
2009-09-11 15:13:53 +03:00
|
|
|
|
*/
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Проверяет уникальность создаваемого процесса
|
2012-04-17 20:58:32 +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
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Снимает блокировку на повторный процесс
|
2012-04-17 20:58:32 +03:00
|
|
|
|
*
|
|
|
|
|
* @return bool
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*/
|
|
|
|
|
public function unsetLock() {
|
|
|
|
|
return ($this->oLockFile && @flock($this->oLockFile, LOCK_UN));
|
|
|
|
|
}
|
|
|
|
|
/**
|
2012-04-17 20:58:32 +03:00
|
|
|
|
* Основной метод крон-процесса.
|
|
|
|
|
* Реализует логику работы крон процесса с последующей передачей управления на пользовательскую функцию
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*
|
2012-04-17 20:58:32 +03:00
|
|
|
|
* @return string
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*/
|
2009-09-10 21:51:58 +03:00
|
|
|
|
public function Exec() {
|
2009-09-10 02:10:30 +03:00
|
|
|
|
/**
|
|
|
|
|
* Если выполнение процесса заблокирован, завершаемся
|
|
|
|
|
*/
|
|
|
|
|
if($this->isLock()) {
|
2009-09-10 21:51:58 +03:00
|
|
|
|
throw new Exception('Try to exec already run process');
|
2009-09-10 02:10:30 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Здесь мы реализуем дополнительную логику:
|
|
|
|
|
* логирование вызова, обработка ошибок,
|
|
|
|
|
* буферизация вывода.
|
|
|
|
|
*/
|
|
|
|
|
ob_start();
|
2009-09-10 21:51:58 +03:00
|
|
|
|
$this->Client();
|
2009-09-10 02:10:30 +03:00
|
|
|
|
/**
|
|
|
|
|
* Получаем весь вывод функции.
|
|
|
|
|
*/
|
|
|
|
|
$sContent=ob_get_contents();
|
|
|
|
|
ob_end_clean();
|
2009-09-10 21:51:58 +03:00
|
|
|
|
|
|
|
|
|
return $sContent;
|
2009-09-10 02:10:30 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
2012-04-17 20:58:32 +03:00
|
|
|
|
* Завершение крон-процесса
|
2009-09-10 02:10:30 +03:00
|
|
|
|
*/
|
|
|
|
|
public function Shutdown() {
|
|
|
|
|
$this->unsetLock();
|
2009-09-11 15:13:53 +03:00
|
|
|
|
$this->Log('Cron process ended');
|
2009-09-10 02:10:30 +03:00
|
|
|
|
}
|
2012-04-17 20:58:32 +03:00
|
|
|
|
/**
|
|
|
|
|
* Вызывается при уничтожении объекта
|
|
|
|
|
*/
|
2009-09-10 02:10:30 +03:00
|
|
|
|
public function __destruct() {
|
|
|
|
|
$this->Shutdown();
|
2009-09-10 21:51:58 +03:00
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* Клиентская функция будет переопределятся в наследниках класса
|
|
|
|
|
* для обеспечивания выполнения основного функционала.
|
|
|
|
|
*/
|
|
|
|
|
public function Client(){
|
|
|
|
|
throw new Exception('Call undefined client function');
|
2009-09-10 02:10:30 +03:00
|
|
|
|
}
|
2012-04-17 20:58:32 +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
|
|
|
|
}
|
|
|
|
|
?>
|