1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-06-26 03:30:48 +03:00

Документация классов

This commit is contained in:
Mzhelskiy Maxim 2012-04-24 19:10:54 +04:00
parent a66b1d642d
commit 29a8ad9f32
3 changed files with 299 additions and 77 deletions

View file

@ -30,13 +30,62 @@ define('SYS_CACHE_TYPE_MEMORY','memory');
define('SYS_CACHE_TYPE_XCACHE','xcache');
/**
* Модуль кеширования
* Работает в двух режимах: файловый кеш через Cache Lite и кеш в памяти через Memcache
* Модуль кеширования.
* Для реализации кеширования используетс библиотека Zend_Cache с бэкэндами File, Memcache и XCache.
* Т.к. в memcache нет встроенной поддержки тегирования при кешировании, то для реализации тегов используется враппер от Дмитрия Котерова - Dklab_Cache_Backend_TagEmuWrapper.
*
* Пример использования:
* <pre>
* // Получает пользователя по его логину
* public function GetUserByLogin($sLogin) {
* // Пытаемся получить значение из кеша
* if (false === ($oUser = $this->Cache_Get("user_login_{$sLogin}"))) {
* // Если значение из кеша получить не удалось, то обращаемся к базе данных
* $oUser = $this->oMapper->GetUserByLogin($sLogin);
* // Записываем значение в кеш
* $this->Cache_Set($oUser, "user_login_{$sLogin}", array(), 60*60*24*5);
* }
* return $oUser;
* }
*
* // Обновляет пользовател в БД
* public function UpdateUser($oUser) {
* // Удаляем кеш конкретного пользователя
* $this->Cache_Delete("user_login_{$oUser->getLogin()}");
* // Удалем кеш со списком всех пользователей
* $this->Cache_Clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG,array('user_update'));
* // Обновлем пользовател в базе данных
* return $this->oMapper->UpdateUser($oUser);
* }
*
* // Получает список всех пользователей
* public function GetUsers() {
* // Пытаемся получить значение из кеша
* if (false === ($aUserList = $this->Cache_Get("users"))) {
* // Если значение из кеша получить не удалось, то обращаемся к базе данных
* $aUserList = $this->oMapper->GetUsers();
* // Записываем значение в кеш
* $this->Cache_Set($aUserList, "users", array('user_update'), 60*60*24*5);
* }
* return $aUserList;
* }
* </pre>
*
* @package engine.modules
* @since 1.0
*/
class ModuleCache extends Module {
/**
* Объект бэкенда кеширования
*
* @var Zend_Cache_Backend
*/
protected $oBackendCache=null;
/**
* Используется кеширование или нет
*
* @var bool
*/
protected $bUseCache;
/**
* Тип кеширования, прописан в глобльном конфиге config.php
@ -44,16 +93,34 @@ class ModuleCache extends Module {
* @var string
*/
protected $sCacheType;
/**
* Статистика кеширования
*
* @var array
*/
protected $aStats=array(
'time' =>0,
'count' => 0,
'count_get' => 0,
'count_set' => 0,
);
/**
* Хранилище для кеша на время сессии
* @see SetLife
* @see GetLife
*
* @var array
*/
protected $aStoreLife=array();
/**
* Префикс для "умного" кеширования
* @see SmartSet
* @see SmartGet
*
* @var string
*/
protected $sPrefixSmartCache='for-smart-cache-';
/**
* Инициализируем нужный тип кеша
*
@ -65,6 +132,9 @@ class ModuleCache extends Module {
if (!$this->bUseCache) {
return false;
}
/**
* Файловый кеш
*/
if ($this->sCacheType==SYS_CACHE_TYPE_FILE) {
require_once(LS_DKCACHE_PATH.'Zend/Cache/Backend/File.php');
$oCahe = new Zend_Cache_Backend_File(
@ -78,12 +148,18 @@ class ModuleCache extends Module {
)
);
$this->oBackendCache = new Dklab_Cache_Backend_Profiler($oCahe,array($this,'CalcStats'));
/**
* Кеш на основе Memcached
*/
} elseif ($this->sCacheType==SYS_CACHE_TYPE_MEMORY) {
require_once(LS_DKCACHE_PATH.'Zend/Cache/Backend/Memcached.php');
$aConfigMem=Config::Get('memcache');
$oCahe = new Dklab_Cache_Backend_MemcachedMultiload($aConfigMem);
$this->oBackendCache = new Dklab_Cache_Backend_TagEmuWrapper(new Dklab_Cache_Backend_Profiler($oCahe,array($this,'CalcStats')));
/**
* Кеш на основе XCache
*/
} elseif ($this->sCacheType==SYS_CACHE_TYPE_XCACHE) {
require_once(LS_DKCACHE_PATH.'Zend/Cache/Backend/Xcache.php');
$aConfigMem=Config::Get('xcache');
@ -100,13 +176,11 @@ class ModuleCache extends Module {
$this->Clean(Zend_Cache::CLEANING_MODE_OLD);
}
}
/**
* Получить значение из кеша
*
* @param string $sName
* @return unknown
* @param string $sName Имя ключа
* @return mixed|bool
*/
public function Get($sName) {
if (!$this->bUseCache) {
@ -129,9 +203,10 @@ class ModuleCache extends Module {
}
/**
* Получения значения из "умного" кеша для борьбы с конкурирующими запросами
* Если кеш "протух", и за ним обращаются много запросов, то только первый запрос вернет FALSE, остальные будут получать чуть устаревшие данные из временного кеша, пока их не обновит первый запрос
*
* @param $sName
* @return bool|unknown
* @param $sName Имя ключа
* @return bool|mixed
*/
public function SmartGet($sName) {
if (!$this->bUseCache) {
@ -146,9 +221,10 @@ class ModuleCache extends Module {
return $data;
}
/**
* псевдо поддержка мульти-запросов к кешу
* Поддержка мульти-запросов к кешу
* Такие запросы поддерживает только memcached, поэтому для остальных типов делаем эмуляцию
*
* @param array $aName
* @param array $aName Имя ключа
* @return bool|array
*/
public function multiGet($aName) {
@ -189,10 +265,10 @@ class ModuleCache extends Module {
/**
* Записать значение в кеш
*
* @param mixed $data
* @param string $sName
* @param array $aTags
* @param int $iTimeLife
* @param mixed $data Данные для хранения в кеше
* @param string $sName Имя ключа
* @param array $aTags Список тегов, для возможности удалять сразу несколько кешей по тегу
* @param int $iTimeLife Время жизни кеша в секундах
* @return bool
*/
public function Set($data,$sName,$aTags=array(),$iTimeLife=false) {
@ -210,11 +286,12 @@ class ModuleCache extends Module {
}
/**
* Устанавливаем значение в "умном" кеша для борьбы с конкурирующими запросами
* Дополнительно сохраняет значение во временном кеше на чуть большее время
*
* @param mixed $data
* @param string $sName
* @param array $aTags
* @param int $iTimeLife
* @param mixed $data Данные для хранения в кеше
* @param string $sName Имя ключа
* @param array $aTags Список тегов, для возможности удалять сразу несколько кешей по тегу
* @param int $iTimeLife Время жизни кеша в секундах
* @return bool
*/
public function SmartSet($data,$sName,$aTags=array(),$iTimeLife=false) {
@ -224,7 +301,7 @@ class ModuleCache extends Module {
/**
* Удаляет значение из кеша по ключу(имени)
*
* @param unknown_type $sName
* @param string $sName Имя ключа
* @return bool
*/
public function Delete($sName) {
@ -240,8 +317,8 @@ class ModuleCache extends Module {
/**
* Чистит кеши
*
* @param void $cMode
* @param array $aTags
* @param int $cMode Режим очистки кеша
* @param array $aTags Список тегов, актуально для режима Zend_Cache::CLEANING_MODE_MATCHING_TAG
* @return bool
*/
public function Clean($cMode = Zend_Cache::CLEANING_MODE_ALL, $aTags = array()) {
@ -251,10 +328,10 @@ class ModuleCache extends Module {
return $this->oBackendCache->clean($cMode,$aTags);
}
/**
* Статистика использования кеша
* Подсчет статистики использования кеша
*
* @param unknown_type $iTime
* @param unknown_type $sMethod
* @param int $iTime Время выполнения метода
* @param string $sMethod имя метода
*/
public function CalcStats($iTime,$sMethod) {
$this->aStats['time']+=$iTime;
@ -266,26 +343,29 @@ class ModuleCache extends Module {
$this->aStats['count_set']++;
}
}
/**
* Возвращает статистику использования кеша
*
* @return array
*/
public function GetStats() {
return $this->aStats;
}
/**
* Сохраняет значение в кеше на время исполнения скрипта (некий аналог Registry)
* Сохраняет значение в кеше на время исполнения скрипта(сессии), некий аналог Registry
*
* @param unknown_type $data
* @param unknown_type $sName
* @param mixed $data Данные для сохранения в кеше
* @param string $sName Имя ключа
*/
public function SetLife($data,$sName) {
$this->aStoreLife[$sName]=$data;
}
/**
* Получает значение из текущего кеша скрипта
* Получает значение из текущего кеша сессии
*
* @param unknown_type $sName
* @return unknown
* @param string $sName Имя ключа
* @return mixed
*/
public function GetLife($sName) {
if (key_exists($sName,$this->aStoreLife)) {

View file

@ -19,7 +19,13 @@ require_once(Config::Get('path.root.engine').'/lib/external/DbSimple/Generic.php
/**
* Модуль для работы с базой данных
* Создаёт объект БД библиотеки DbSimple Дмитрия Котерова
* Модуль используется в основном для создания коннекта к БД и передачи его в маппер
* @see Mapper::__construct
* Так же предоставляет методы для быстрого выполнения запросов/дампов SQL, актуально для плагинов
* @see Plugin::ExportSQL
*
* @package engine.modules
* @since 1.0
*/
class ModuleDatabase extends Module {
/**
@ -39,8 +45,8 @@ class ModuleDatabase extends Module {
/**
* Получает объект БД
*
* @param array $aConfig - конфиг подключения к БД(хост, логин, пароль, тип бд, имя бд)
* @return DbSimple
* @param array|null $aConfig - конфиг подключения к БД(хост, логин, пароль, тип бд, имя бд), если null, то используются параметры из конфига Config::Get('db.params')
* @return DbSimple_Generic_Database DbSimple
*/
public function GetConnect($aConfig=null) {
/**
@ -89,8 +95,11 @@ class ModuleDatabase extends Module {
return $oDbSimple;
}
}
/**
* Возвращает статистику использования БД - время и количество запросов
*
* @return array
*/
public function GetStats() {
$aQueryStats=array('time'=>0,'count'=>-1); // не считаем тот самый костыльный запрос, который устанавливает настройки DB соединения
foreach ($this->aInstance as $oDb) {
@ -101,13 +110,13 @@ class ModuleDatabase extends Module {
$aQueryStats['time']=round($aQueryStats['time'],3);
return $aQueryStats;
}
/**
* Экспорт SQL дампа
* Экспорт SQL дампа в БД
* @see ExportSQLQuery
*
* @param unknown_type $sFilePath
* @param unknown_type $aConfig
* @return unknown
* @param string $sFilePath Полный путь до файла SQL
* @param array|null $aConfig Конфиг подключения к БД
* @return array
*/
public function ExportSQL($sFilePath,$aConfig=null) {
if(!is_file($sFilePath)){
@ -120,11 +129,11 @@ class ModuleDatabase extends Module {
}
/**
* Экспорт SQL
* Экспорт SQL в БД
*
* @param unknown_type $sFileQuery
* @param unknown_type $aConfig
* @return unknown
* @param string $sFileQuery Строка с SQL запросом
* @param array|null $aConfig Конфиг подключения к БД
* @return array Возвращает массив вида array('result'=>bool,'errors'=>array())
*/
public function ExportSQLQuery($sFileQuery,$aConfig=null) {
/**
@ -152,7 +161,6 @@ class ModuleDatabase extends Module {
if($bResult===false) $aErrors[] = mysql_error();
}
}
/**
* Возвращаем результат выполнения, взависимости от количества ошибок
*/
@ -161,12 +169,11 @@ class ModuleDatabase extends Module {
}
return array('result'=>false,'errors'=>$aErrors);
}
/**
* Проверяет существование таблицы
*
* @param string $sTableName
* @param array $aConfig
* @param string $sTableName Название таблицы, необходимо перед именем таблицы добавлять "prefix_", это позволит учитывать произвольный префикс таблиц у пользователя
* @param array|null $aConfig Конфиг подключения к БД
* @return bool
*/
public function isTableExists($sTableName,$aConfig=null) {
@ -177,13 +184,12 @@ class ModuleDatabase extends Module {
}
return false;
}
/**
* Проверяет существование поля в таблице
*
* @param string $sTableName
* @param string $sFieldName
* @param array $aConfig
* @param string $sTableName Название таблицы, необходимо перед именем таблицы добавлять "prefix_", это позволит учитывать произвольный префикс таблиц у пользователя
* @param string $sFieldName Название поля в таблице
* @param array|null $aConfig Конфиг подключения к БД
* @return bool
*/
public function isFieldExists($sTableName,$sFieldName,$aConfig=null) {
@ -198,14 +204,13 @@ class ModuleDatabase extends Module {
}
return false;
}
/**
* Доавляет новый тип в поле таблицы с типом enum
*
* @param string $sTableName
* @param string $sFieldName
* @param string $sType
* @param array $aConfig
* @param string $sTableName Название таблицы, необходимо перед именем таблицы добавлять "prefix_", это позволит учитывать произвольный префикс таблиц у пользователя
* @param string $sFieldName Название поля в таблице
* @param string $sType Название типа
* @param array|null $aConfig Конфиг подключения к БД
*/
public function addEnumType($sTableName,$sFieldName,$sType,$aConfig=null) {
$sTableName = str_replace('prefix_', Config::Get('db.table.prefix'), $sTableName);
@ -230,8 +235,8 @@ class ModuleDatabase extends Module {
/**
* Функция хука для перехвата SQL ошибок
*
* @param string $message
* @param unknown_type $info
* @param string $message Сообщение об ошибке
* @param array $info Список информации об ошибке
*/
function databaseErrorHandler($message, $info) {
/**
@ -267,7 +272,7 @@ function databaseErrorHandler($message, $info) {
* Функция логгирования SQL запросов
*
* @param object $db
* @param unknown_type $sql
* @param array $sql
*/
function databaseLogger($db, $sql) {
/**

View file

@ -15,11 +15,64 @@
---------------------------------------------------------
*/
/**
* Модуль поддержки хуков(hooks)
* Модуль обработки хуков(hooks)
* В различных местах кода могут быть определеные вызовы хуков, например:
* <pre>
* $this->Hook_Run('topic_edit_before', array('oTopic'=>$oTopic,'oBlog'=>$oBlog));
* </pre>
* Данный вызов "вешает" хук "topic_edit_before"
* Чтобы повесить обработчик на этот хук, его нужно объявить, например, через файл в /classes/hooks/HookTest.class.php
* <pre>
* class HookTest extends Hook {
* // Регистрируем хуки (вешаем обработчики)
* public function RegisterHook() {
* $this->AddHook('topic_edit_before','TopicEdit');
* }
* // обработчик хука
* public function TopicEdit($aParams) {
* $oTopic=$aParams['oTopic'];
* $oTopic->setTitle('My title!');
* }
* }
* </pre>
* В данном примере после редактирования топика заголовок у него поменяется на "My title!"
*
* Если хук объявлен в шаблоне, например,
* <pre>
* {hook run='html_head_end'}
* </pre>
* То к имени хука автоматически добаляется префикс "template_" и обработчик на него вешать нужно так:
* <pre>
* $this->AddHook('template_html_head_end','InjectHead');
* </pre>
*
* Так же существуют блочные хуки, который объявляются в шаблонах так:
* <pre>
* {hookb run="registration_captcha"}
* ... html ...
* {/hookb}
* </pre>
* Они позволяют заменить содержимое между {hookb ..} {/hookb} или добавть к нему произвольный контент. К имени такого хука добавляется префикс "template_block_"
* <pre>
* class HookTest extends Hook {
* // Регистрируем хуки (вешаем обработчики)
* public function RegisterHook() {
* $this->AddHook('template_block_registration_captcha','MyCaptcha');
* }
* // обработчик хука
* public function MyCaptcha($aParams) {
* $sContent=$aParams['content'];
* return $sContent.'My captcha!';
* }
* }
* </pre>
* В данном примере в конце вывода каптчи будет добавлено "My captcha!"
* Обратите внимаете, что в обработчик в параметре "content" передается исходное содержание блока.
*
* @package engine.modules
* @since 1.0
*/
class ModuleHook extends Module {
/**
* Содержит список хуков
*
@ -35,11 +88,12 @@ class ModuleHook extends Module {
*/
protected $aHooks=array();
/**
* Hook objects
* Список объектов обработки хукков, для их кешировани
*
* @var unknown_type
* @var array
*/
protected $aHooksObject=array();
/**
* Инициализация модуля
*
@ -47,7 +101,16 @@ class ModuleHook extends Module {
public function Init() {
}
/**
* Добавление обработчика на хук
*
* @param string $sName Имя хука
* @param string $sType Тип хука, возможны: module, function, hook
* @param string $sCallBack Функция/метод обработки хука
* @param int $iPriority Приоритер обработки, чем выше, тем раньше сработает хук относительно других
* @param array $aParams Список дополнительных параметров, анпример, имя класса хука
* @return bool
*/
public function Add($sName,$sType,$sCallBack,$iPriority=1,$aParams=array()) {
$sName=strtolower($sName);
$sType=strtolower($sType);
@ -56,32 +119,100 @@ class ModuleHook extends Module {
}
$this->aHooks[$sName][]=array('type'=>$sType,'callback'=>$sCallBack,'params'=>$aParams,'priority'=>(int)$iPriority);
}
/**
* Добавляет обработчик хука с типом "module"
* Позволяет в качестве обработчика использовать метод модуля
* @see Add
*
* @param string $sName Имя хука
* @param string $sCallBack Полное имя метода обработки хука, например, "Mymodule_CallBack"
* @param int $iPriority Приоритер обработки, чем выше, тем раньше сработает хук относительно других
* @return bool
*/
public function AddExecModule($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'module',$sCallBack,$iPriority);
}
/**
* Добавляет обработчик хука с типом "function"
* Позволяет в качестве обработчика использовать функцию
* @see Add
*
* @param string $sName Имя хука
* @param string $sCallBack Функция обработки хука, например, "var_dump"
* @param int $iPriority Приоритер обработки, чем выше, тем раньше сработает хук относительно других
* @return bool
*/
public function AddExecFunction($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'function',$sCallBack,$iPriority);
}
/**
* Добавляет обработчик хука с типом "hook"
* Позволяет в качестве обработчика использовать метод хука(класса хука из каталога /classes/hooks/)
* @see Add
* @see Hook::AddHook
*
* @param string $sName Имя хука
* @param string $sCallBack Метод хука, например, "InitAction"
* @param int $iPriority Приоритер обработки, чем выше, тем раньше сработает хук относительно других
* @param array $aParams Параметры
* @return bool
*/
public function AddExecHook($sName,$sCallBack,$iPriority=1,$aParams=array()) {
return $this->Add($sName,'hook',$sCallBack,$iPriority,$aParams);
}
/**
* Добавляет делегирующий обработчик хука с типом "module"
* Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля
* Позволяет в качестве обработчика использовать метод модуля
* @see Add
* @see Engine::_CallModule
*
* @param string $sName Имя хука
* @param string $sCallBack Полное имя метода обработки хука, например, "Mymodule_CallBack"
* @param int $iPriority Приоритер обработки, чем выше, тем раньше сработает хук относительно других
* @return bool
*/
public function AddDelegateModule($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'module',$sCallBack,$iPriority,array('delegate'=>true));
}
/**
* Добавляет делегирующий обработчик хука с типом "function"
* Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля
* Позволяет в качестве обработчика использовать функцию
* @see Add
*
* @param string $sName Имя хука
* @param string $sCallBack Функция обработки хука, например, "var_dump"
* @param int $iPriority Приоритер обработки, чем выше, тем раньше сработает хук относительно других
* @return bool
*/
public function AddDelegateFunction($sName,$sCallBack,$iPriority=1) {
return $this->Add($sName,'function',$sCallBack,$iPriority,array('delegate'=>true));
}
/**
* Добавляет делегирующий обработчик хука с типом "hook"
* Делегирующий хук применяется для перекрытия метода модуля, результат хука возвращает вместо результата метода модуля
* Позволяет в качестве обработчика использовать метод хука(класса хука из каталога /classes/hooks/)
* @see Add
* @see Hook::AddHook
*
* @param string $sName Имя хука
* @param string $sCallBack Метод хука, например, "InitAction"
* @param int $iPriority Приоритер обработки, чем выше, тем раньше сработает хук относительно других
* @param array $aParams Параметры
* @return bool
*/
public function AddDelegateHook($sName,$sCallBack,$iPriority=1,$aParams=array()) {
$aParams['delegate']=true;
return $this->Add($sName,'hook',$sCallBack,$iPriority,$aParams);
}
/**
* Запускает обаботку хуков
*
* @param $sName Имя хука
* @param array $aVars Список параметров хука, передаются в обработчик
* @return array
*/
public function Run($sName,&$aVars=array()) {
$result=array();
$sName=strtolower($sName);
@ -133,7 +264,13 @@ class ModuleHook extends Module {
}
return $result;
}
/**
* Запускает обработчик хука в зависимости от туипа обработчика
*
* @param array $aHook Данные хука
* @param array $aVars Параметры переданные в хук
* @return mixed|null
*/
protected function RunType($aHook,&$aVars) {
$result=null;
switch ($aHook['type']) {