24.07.2010, 15:20
|
#2
|
Пользователь
Регистрация: 27.03.2010
Сообщений: 80
Сказал(а) спасибо: 12
Поблагодарили 25 раз(а) в 13 сообщениях
|
3. Кеширование
Распределение нагрузки - весьма важная часть в работе любого веб-мастера. Со временем растёт ваш сайт, растёт, а вместе с ним растёт и нагрузка. Один из самых простых и действенных способов её снизить - кеширование результатов. В DLE есть встроенные инструменты для кеширования, но мы пойдём по длинному пути.
1 Из моих знакомых написал весьма простенький, но в тоже время действенный класс для кеширования.
PHP код:
<?php
/**
* @descr класс для работы с кешированием данных
* поддерживает как массив данных, так и простой текст.
* @author Dmitriy 'FlashBlack' Chubrick (d.chubrick@smartdesign.by)
* @param $szPath string путь до папки с кеш
* @param $nCacheLifeTime int время жизни кеш файла
*/
class cacheClass {
private $Content = FALSE;
private $szPath;
private $nCacheLifeTime; //время жизни файлов
/**
* @descr конструктор
* @param $szPath string путь к папке с кеш-файлами (на конце слеш (/) обязательно
* @param $nCacheLifeTime int время жизни кеш файла
*/
function __construct($szPath, $nCacheLifeTime) {
$this->szPath = $szPath;
$this->nCacheLifeTime = $nCacheLifeTime;
}
/**
* @descr устанавливаем контент
* @param $content array\string контент, может быть как массив, так и текст
*/
public function setContent($content) {
if ( ! $content) {
$this->Content = FALSE;
}
else {
if (is_array($content)) {
$this->Content = serialize($content);
}
else {
$this->Content = $content;
}
}
}
/**
* @descr получаем контент
* @return array\string
*/
public function getContent() {
return $this->Content;
}
/**
* @descr функция для проверки, пора ли перезаписывать кеш, либо нет.
* @param $szFileName string кеш-индификатор
* @return boolean
*/
public function checkForWrite($szFileName) {
$szCacheFileName = $this->szPath.$szFileName.'.cache';
if (file_exists($szCacheFileName)) {
$nModifyTime = filemtime($szCacheFileName);
if (($nModifyTime + $this->nCacheLifeTime) < time()) {
return TRUE;
}
}
else {
return TRUE;
}
return FALSE;
}
/**
* @descr записываем кеш-индификатор с контентом getContent()
* @param $szFileName string название кеш-индификатора
*/
public function writeCache($szFileName) {
$szCacheFileName = $this->szPath.$szFileName.'.cache';
if (file_exists($szCacheFileName)) {
if ($this->checkForWrite($szFileName)) {
file_put_contents($szCacheFileName, $this->getContent());
}
}
else {
file_put_contents($szCacheFileName, $this->getContent());
}
}
/**
* @descr читаем кеш-индификатор
* @return array\string
*/
public function readCache($szFileName) {
$szCacheFileName = $this->szPath.$szFileName.'.cache';
$szContent = file_get_contents($szCacheFileName);
if ( is_array(@unserialize($szContent)) ) {
return unserialize($szContent);
}
else {
return $szContent;
}
}
}
?>
Сохраняем его в папке /engine/ именем cacheClass.php
Разберём его применение на созданных нами ранее модулях:
3.1. Кеширование модуля, созданного в качестве блока:
Чтобы результаты его выполнения кешировались, нам необходимо в файле index.php сделатать следующее ( не учитываются изменения файла в прошлом сообщении. За модель берётся чистый файл).
Находим
PHP код:
define ( 'ENGINE_DIR', ROOT_DIR . '/engine' );
Ниже вставляем
PHP код:
require_once ENGINE_DIR' . '/modules/status.php;
Находим
PHP код:
$tpl->set ( '{headers}', $metatags."\n".build_js($js_array, $config) );
Ниже вставляем
PHP код:
include_once ENGINE_DIR."/cacheClass.php";
define('CACHE_NAME', 'status');
$cache = new cacheClass(ENGINE_DIR.'/cache/', CACHETIME);
if ( $cache->checkForWrite(CACHE_NAME) ) {
$cache->setContent($serv_status);
$cache->writeCache(CACHE_NAME);
$tpl->set('{status}', $cache->readCache(CACHE_NAME));
}
else {
$tpl->set('{status}', $cache->readCache(CACHE_NAME));
}
В данном случае константа CACHE_NAME отвечает за название файла кеша, CACHETIME время кеширования рещультатов (указывается в секундах), переменная $serv_status отвечает за кешируемый контент, {status} - необходимо добавить в шаблон, в котором будет отображаться модуль.
3.1. Кеширование модуля, созданного в качестве страницы:
Возьмём за основу модуль-страницу, которые создали ранее:
PHP код:
<?php
if( ! defined( 'DATALIFEENGINE' ) ) die( "Hacking attempt!" );
$fp = @fsockopen(SHOST, SPORT, $errno, $errstr, 5);
$status=($fp?"<font color='green'>работает</font>":"<font color='red'>отключен</font>");
$serv_status = <<<HTML
Статус сервера - {$status}
HTML;
$tpl->result***91;'content'***93; = $serv_status;
?>
Чтобы результаты его выполнения кешировались, добавим в него класс для работы с кешем:
PHP код:
<?php
if( ! defined( 'DATALIFEENGINE' ) ) die( "Hacking attempt!" );
require_once ROOT_DIR . '/engine/cacheClass.php'; // Подключаем файл кеширования
define('CACHE_NAME', 'bla');
$cache = new cacheClass(ENGINE_DIR.'/cache/', CACHETIME);
if ($cache->checkForWrite(CACHE_NAME))
{
$fp = @fsockopen(SHOST, SPORT, $errno, $errstr, 5);
$status=($fp?"<font color='green'>работает</font>":"<font color='red'>отключен</font>");
$serv_status = <<<HTML
Статус сервера - {$status}
HTML;
$cache->setContent($serv_status);
$cache->writeCache(CACHE_NAME);
$tpl->result***91;'content'***93; = $cache->getContent();
}
else
{
$tpl->result***91;'content'***93; = $cache->readCache(CACHE_NAME);
}
?>
Принцип одинаков. Константа CACHE_NAME отвечает за название файла кеша, CACHETIME - время хранения кеша (в секундах)
Последний раз редактировалось Праведник; 24.07.2010 в 15:26.
|
|
|