1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-05 16:04:24 +03:00
ifhub.club/classes/engine/Engine.class.php

284 lines
8.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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
*
---------------------------------------------------------
*/
/**
* Основной класс движка, который позволяет напрямую обращаться к любому модулю
*
*/
class Engine extends Object {
static protected $oInstance=null;
protected $aModules=array();
protected $aConfigModule;
public $iTimeLoadModule=0;
/**
* При создании объекта делаем инициализацию
*
*/
protected function __construct() {
$this->Init();
}
/**
* Ограничиваем объект только одним экземпляром
*
* @return Engine
*/
static public function getInstance() {
if (isset(self::$oInstance) and (self::$oInstance instanceof self)) {
return self::$oInstance;
} else {
self::$oInstance= new self();
return self::$oInstance;
}
}
/**
* Инициализация
*
*/
protected function Init() {
$this->LoadModules();
}
/**
* Производит инициализацию всех модулей
*
*/
public function InitModules() {
foreach ($this->aModules as $oModule) {
$oModule->Init();
}
}
/**
* Завершаем работу всех модулей
*
*/
public function ShutdownModules() {
foreach ($this->aModules as $sKey => $oModule) {
$oModule->Shutdown();
}
}
/**
* Выполняет загрузку модуля по его названию
*
* @param string $sModuleName
* @param bool $bInit - инициализировать модуль или нет
* @return unknown
*/
protected function LoadModule($sModuleName,$bInit=false) {
$tm1=microtime(true);
$sPrefixSys='';
if ($this->isFileExists(DIR_SERVER_ROOT."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php")) {
require_once(DIR_SERVER_ROOT."/classes/modules/".strtolower($sModuleName)."/".$sModuleName.".class.php");
} elseif ($this->isFileExists(DIR_SERVER_ROOT."/classes/modules/sys_".strtolower($sModuleName)."/".$sModuleName.".class.php")) {
require_once(DIR_SERVER_ROOT."/classes/modules/sys_".strtolower($sModuleName)."/".$sModuleName.".class.php");
$sPrefixSys='sys_';
} else {
throw new Exception($this->Lang_Get('system_error_module')." - ".$sModuleName);
}
/**
* Проверяем наличие кастомного класса
*/
$sPrefixCustom='';
if ($this->isFileExists(DIR_SERVER_ROOT."/classes/modules/".$sPrefixSys.strtolower($sModuleName)."/".$sModuleName.".class.custom.php")) {
require_once(DIR_SERVER_ROOT."/classes/modules/".$sPrefixSys.strtolower($sModuleName)."/".$sModuleName.".class.custom.php");
$sPrefixCustom='_custom';
}
/**
* Создаем объект модуля
*/
$sModuleNameClass='Ls'.$sModuleName.$sPrefixCustom;
$oModule=new $sModuleNameClass($this);
if ($bInit or $sModuleName=='Cache') {
$oModule->Init();
}
$this->aModules[$sModuleName]=$oModule;
$tm2=microtime(true);
$this->iTimeLoadModule+=$tm2-$tm1;
dump("load $sModuleName - \t\t".($tm2-$tm1)."");
return $oModule;
}
/**
* Загружает все используемые модули и передает им в конструктор ядро
*
*/
protected function LoadModules() {
$this->LoadConfig();
foreach ($this->aConfigModule['autoLoad'] as $sModuleName) {
$this->LoadModule($sModuleName);
}
}
/**
* Выполняет загрузку конфигов
*
*/
protected function LoadConfig() {
$this->aConfigModule=include(DIR_SERVER_ROOT."/config/config.module.php");
/**
* Ищет конфиги модулей и объединяет их с текущим
*/
$sDirConfig=DIR_SERVER_ROOT.'/config/modules/';
if ($hDirConfig = opendir($sDirConfig)) {
while (false !== ($sDirModule = readdir($hDirConfig))) {
if ($sDirModule !='.' and $sDirModule !='..' and is_dir($sDirConfig.$sDirModule)) {
$sFileConfig=$sDirConfig.$sDirModule.'/config.module.php';
if (file_exists($sFileConfig)) {
$aConfigModule=include($sFileConfig);
$this->aConfigModule=array_merge_recursive($this->aConfigModule,$aConfigModule);
}
}
}
closedir($hDirConfig);
}
}
/**
* Регистрирует хуки из /classes/hooks/
*
*/
public function InitHooks() {
$sDirHooks=DIR_SERVER_ROOT.'/classes/hooks/';
if ($hDir = opendir($sDirHooks)) {
while (false !== ($sFile = readdir($hDir))) {
if ($sFile !='.' and $sFile !='..' and is_file($sDirHooks.$sFile)) {
if (preg_match("/^Hook([\w]+)\.class\.php$/i",$sFile,$aMatch)) {
require_once($sDirHooks.$sFile);
$sClassName='Hook'.$aMatch[1];
$oHook=new $sClassName;
$oHook->RegisterHook();
}
}
}
closedir($hDir);
}
}
/**
* Проверяет файл на существование, если используется кеширование memcache то кеширует результат работы
*
* @param unknown_type $sFile
* @return unknown
*/
public function isFileExists($sFile,$iTime=3600) {
if (strpos($sFile,'/Cache.class.')!==false) {
return file_exists($sFile);
}
if (SYS_CACHE_USE and SYS_CACHE_TYPE==SYS_CACHE_TYPE_MEMORY) {
if (false === ($data = $this->Cache_Get("file_exists_{$sFile}"))) {
$data=file_exists($sFile);
$this->Cache_Set((int)$data, "file_exists_{$sFile}", array(), $iTime);
}
return $data;
} else {
return file_exists($sFile);
}
}
/**
* Вызывает метод нужного модуля
*
* @param string $sName
* @param array $aArgs
* @return unknown
*/
public function _CallModule($sName,$aArgs) {
$sArgs='';
$aStrArgs=array();
foreach ($aArgs as $sKey => $arg) {
$aStrArgs[]='$aArgs['.$sKey.']';
}
$sArgs=join(',',$aStrArgs);
$aName=explode("_",$sName);
$sModuleName=$aName[0];
if (isset($this->aModules[$sModuleName])) {
$oModule=$this->aModules[$sModuleName];
} else {
$oModule=$this->LoadModule($sModuleName,true);
}
$sCmd='$result=$oModule->'.$aName[1].'('.$sArgs.');';
eval($sCmd);
return $result;
/*
$sCmd='$bExists=isset($this->MOD_'.$sModuleName.');';
eval($sCmd);
if ($bExists) {
$sCmd='$bExists=method_exists($this->MOD_'.$sModuleName.',"'.$aName[1].'");';
eval($sCmd);
if ($bExists) {
$sCmd='$result=$this->MOD_'.$sModuleName.'->'.$aName[1].'('.$sArgs.');';
eval($sCmd);
return $result;
}
throw new Exception('В модуле '.$sModuleName.' нет метода '.$aName[1].'()');
} else {
throw new Exception("Не найден модуль: ".$sModuleName);
}
*/
return false;
}
/**
* Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
*
* @param string $sName
* @param array $aArgs
* @return unknown
*/
public function __call($sName,$aArgs) {
return $this->_CallModule($sName,$aArgs);
}
/**
* Блокируем копирование/клонирование объекта роутинга
*
*/
protected function __clone() {
}
}
/**
* Автозагрузка кслассов
*
* @param unknown_type $sClassName
*/
function __autoload($sClassName) {
/**
* Если класс подходит под шблон класса сущности то згружаем его
*/
if (preg_match("/^(\w+)Entity\_(\w+)$/i",$sClassName,$aMatch)) {
$tm1=microtime(true);
$sFileClass=DIR_SERVER_ROOT.'/classes/modules/'.strtolower($aMatch[1]).'/entity/'.$aMatch[2].'.entity.class.php';
if (file_exists($sFileClass)) {
require_once($sFileClass);
$tm2=microtime(true);
dump($sClassName." - \t\t".($tm2-$tm1));
}
}
}
?>