• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Хак Файловое кеширование DLE (снижаем нагрузку на БД)

Статус
В этой теме нельзя размещать новые ответы.

kodges

Создатель
Регистрация
16 Фев 2007
Сообщения
32
Реакции
28
Решил выложить организованный мной метод файлового кеширования в DLE, может кому пригодится :)
1. Создаем папку /engine/cache/all и ставим на нее права на запись (chmod 777 или 775 в зависимости от хостера).
2. Открываем index.php и редактируем:
Находим:
PHP:
@session_start ();
Вставляем после:
PHP:
///////////////Файловое кэширование//////////////
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;
    }
}
/////////////////////////////////////////////////
Находим:
PHP:
$tpl->compile ( 'main' );
Вставляем перед:
PHP:
ob_start();
Находим:
PHP:
GzipOut ();
Вставляем после:
PHP:
//////////Файловое кэширование//////////
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 гигабайта. Для сайтов с меньшей посещаемостью можно уменьшить время жизни кеша и соответственно уменьшится его размер на винчестере.

PS: Рад если кому пригодилось :)
 
а что делать с @ob_start(); в начале файла?
удалить?
 
а что делать с @ob_start(); в начале файла?
удалить?
Не надо удалять, пусть будет я не уверен но насколько мне показалось движек где-то потом закрывает свой запуск @ob_start();
именно поэтому нужно добавить еще один запуск буферизации в указанном в инструкции месте.
Возможно я ошибаюсь, на нобелевку не претендую :)
Но мой вариант работает 100%
 
  • Заблокирован
  • #4
GzipOut я не нашёл чёт , на какой строке он ? ;)
 
GzipOut я не нашёл чёт , на какой строке он ? ;)
GzipOut (); это последняя строка. У меня например так:
PHP:
echo $tpl->result['main'];
$tpl->global_clear ();
$db->close ();
GzipOut ();

////////////Файловое кэширование/////////////
if($_SESSION['dle_user_id'] == 0 && $_SERVER['REQUEST_METHOD'] == "GET")
{
    $pageBuf = ob_get_contents();
    $fp = fopen($FCache, "w");
    fputs($fp, $pageBuf);
    fclose($fp);
}
/////////////////////////////////////////////
?>
 
Данный кеш идет отдельно от основного или вместо него? Тоесть грубо говоря, если я изменю менюшку или баннер, зайду в админку и сброшу кеш то на сайте все обновиться а статьи остануться в ЭТОМ кеше не тронутыми? Или кеш заменяет родной и при обновлении меню нужно его сносить?
 
  • Заблокирован
  • #7
лифт это отдельный скрипт кеша,который висит на кроне,как задаш крон так и будет сбрасываться время
 
Как правильно заметил Dark Angell, этот скрипт файлового кеширования никак не связан с встроенным кешированием DLE, тоесть, если вы в админке жмете "Очистить кеш" то тем самым Вы очищаете только встроенный кеш движка но не файловый кеш.
Но это совсем не страшно :) Ибо если вы разбираетесь в php то должны заметить что данный скрипт кеширует только страницы для незарегистрированных пользователей получаемых GET запросм, а это значит что как только Вы или любой другой посетитель авторизовался на сайте, то для него сраницы начинают выдаваться не из файлового кеша, а из встроенного кеша либо генерироваться движком с нуля, таким образом Вам как админу все изменения сделанные в шаблоне или где то еще будут отображаться сразу (при условии что встроенный кеш движка обнулен или отключен), а вот все неавторизованные пользователи или иными словами гости, увидят изменения только по мере обновления файлового кеша.
 
а какое посоветуешь оптимальное время поставить жизни кеша если посещаемость к примеру 5-10 к
то время которое сейчас в твоем коде я думаю будет многово то для сайта с 5-10 к в сутки
 
Dark Angell
Та я все понял про крон. Ты знаеш мои объемы баз просто, раз в месяц зайду удалю кеш руками. Если не забуду конечно :) Вопрос не в этом.
kodges
Простой конкретный вопрос: без сброса твоего кеша незарегеные юзеры (ака поисковики) будут видеть изменения в сапа-ссылках и их аналогах или нет? Мне хватит просто ответа да/нет и все :)
И второй просто вопрос: пока не удалю кеш кроном/руками он будет болтаться в папке даже при привышении времени
$cache_time = 21600; //Время жизни кеша в секундах
и просто в папку будет добавлен новый кеш для этой страници, да?

И обновляю: сейчас воткнул его на 8.2 и в ответ тишина. Тоесть не набирается кеш в папку all. Права нормальные, ставил по первому посту копипастом.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху