oEngine=Engine::getInstance(); 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) { $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'); } } ?>