loading...

Авторизация ...

Имя пользователя :
Пароль :
я всё забыл!

ХакиФайловое кеширование DLE

Написал vanea, 25 ноября 2010 | 8 комментариев | рейтинг новости не нравится   0   нравится Версия для печати
Нашел на одном из форумов очень интересную инструкцию по хешированию DLE полной страницы

Инструкция по установке:
1. Создаем папку /engine/cache/all и ставим на нее права на запись (chmod 777 или 775 в зависимости от хостера).
2. Открываем index.php и редактируем:
Находим:
@session_start ();  

Вставляем после:
///////////////Файловое кэширование//////////////  
if($_SESSION['dle_user_id'] == 0 && $_SERVER['REQUEST_METHOD'] == "GET")  
{  
    $cache_time = 21600; //Время жизни кеша в секундах  
    $FCache = $_SERVER['DOCUMENT_ROOT'].'/engine/cache/all/'.md5($_SERVER['REQUEST_URI']).'.html';  
    if (file_exists($FCache) && filemtime($FCache)>time()-$cache_time)  
    {  
        echo join('',file($FCache))."<!-- use cache -->";  
        exit;  
    }  
}  
/////////////////////////////////////////////////  


Находим:
$tpl->compile ( 'main' );  

Вставляем перед:
ob_start();

Находим:
GzipOut ();  

Вставляем после:
//////////Файловое кэширование//////////  
if($_SESSION['dle_user_id'] == 0 && $_SERVER['REQUEST_METHOD'] == "GET")  
{  
    $pageBuf = ob_get_contents();  
    $fp = fopen($FCache, "w");  
    fputs($fp, $pageBuf);  
    fclose($fp);  
}  
////////////////////////////////////////


После этих манипуляций в папке /engine/cache/all будут накапливаться кешированные страницы сайта.
Для того чтобы устаревший кеш редкооткрываемых страниц не копился и не забивал вам винчестер, добавляем по крону выполнение следующего скрипта каждые 10 минут например.

PHP код:
<?  
$cache_time = 21600+10; //Время жизни кеша в секундах + 10 секунд  
$url = "/home/admin/domains/site.ru/public_html/engine/cache/all/"; // полный путь к папке с кешем от корня сервера.  
$dir = opendir($url);  
while(($file = readdir($dir)) !== false)  
{  
    $ras = pathinfo($file);  
    if($ras[extension] == 'html')  
    {  
        $FCache = $url.$file;  
        if (file_exists($FCache) && filemtime($FCache) < time()-$cache_time)  
        {  
            unlink($FCache);  
        }  
    }  
}  
closedir($dir);  
?>


Данный метод кеширования существенно снижает нагрузку на базу данных. К примеру у автора инструкции есть сайт на DLE с посещаемостью 70к+ в сутки, а благодаря файловому кешированию нагрузка на базу данных не превышает 70%. Без данного кеширования, при такой посещаемости, DLE просто ложил базу данных MySQL на выделенном сервере!
В данном примере время жизни кеша 6 часов, оптимально для сайтов с посещаемостью более 50к. При этом кеш занимает на диске 2-3 гигабайта. Для сайтов с меньшей посещаемостью можно уменьшить время жизни кеша и соответственно уменьшится его размер на винчестере.

Отблагодарили: Omnesis

Комментарии пользователей

  Экспорт комментариев в RSS
 Сортировать по рейтингу, по дате

Написал aL13n, 25 ноября 2010 в 20:11 плохой комментарий   0   хороший комментарий
Новостей: 3, комментариев: 111, Пользователи
Карма: 10±
70к ложили выделенный сервер? Стесняюсь спросить, что там за выделенный сервер такой, и сколько запросов выполняется на той же главной странице? Или быть может на нем ни один сайт крутится? Видимо поднят веб-сервер из "коробки".
Лучше использовать память, используя акселераторы, чем насиловать винчестер вот таким вот способом.

Написал inettusovka, 25 ноября 2010 в 20:12 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 13, Пользователи
Карма: -1±
Прежде чем дуплить новости сначало проверь на работоспособность. Задрали вы уже копипастеры ag

Написал igramnet, 25 ноября 2010 в 21:23 плохой комментарий   0   хороший комментарий
Новостей: 10, комментариев: 41, Пользователи
Карма:
Какой смысл кешировать всю страницу? Это не удобно и глупо, т.к. поднятия её из файлового кеша порой "тяжелее", чем сгенерировать страницу.

Написал Zergio, 25 ноября 2010 в 21:59 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 29, Пользователи
Карма:
Прикольно, люди думают, что те кто заменял в свое время html страницы на php+sql - идиоты, а они вот придумали что-то новое. Занятно.

Написал AVET, 26 ноября 2010 в 01:23 плохой комментарий   0   хороший комментарий
Новостей: 16, комментариев: 523, Редактор
Карма: 12±
В DLE достаточно своего кеширования: для полной новости, для кастомов, для счётчиков. Советую поглядеть в настройки.

Написал Bomberman, 26 ноября 2010 в 23:53 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 140, Пользователи
Карма:
В дле кешируется почти всё, что создаёт высокую нагрузку. Исключение составляет полная новость - она не кешируется.
В ней кешируется только список ссылок на "Новости по теме"
Если сделать кеширование полной новости, в некоторых случаях это увеличит производительность.
По умолчанию конешно это не нужно.
Автор, если 70к с + ложат твою базу, но при этом не ложат файловую систему с 2-3 гигабайта кеша - у тебя явно что-то не то.

По сути вывод текста из базы без всякой обработки намного быстрее чем вывод того же текста из файла. Кеширование всего всегда увеличивает, а не уменьшает нагрузку!

Написал fatalenergy, вчера, 20:28 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 15, Пользователи
Карма:
чрезмерное кеширование ложит файловую систему

Написал Bomberman, вчера, 22:01 плохой комментарий   +2   хороший комментарий
Новостей: 0, комментариев: 140, Пользователи
Карма:
Впридачу ещё и не дописал
Для того чтобы устаревший кеш редкооткрываемых страниц не копился и не забивал вам винчестер, добавляем по крону выполнение следующего скрипта каждые 10 минут например.

Никак иначе кроме как выходом для лентяев назвать нельзя. Кеш должен обновляться не каждые n секунд, а когда обновляется содержимое страницы. Удаление кеша надо делать в соответствующих скриптах (добавление, редактирование новости, добавление, редактирование комментария, перенос новостей и т.д.)

Информация



Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
Rambler's Top100

[removed][removed] [removed] (adsbygoogle = window.adsbygoogle || []).push({}); [removed]