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

Тема в разделе "DLE", создана пользователем kodges, 14 фев 2010.

Информация :
Актуальная версия DataLife Engine 11.3
( Final Release v.11.3 | Скачать DataLife Engine | Скачать 11.3 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.2 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Статус темы:
Закрыта.
Модераторы: killoff
  1. kodges

    kodges Создатель

    Регистр.:
    16 фев 2007
    Сообщения:
    32
    Симпатии:
    27
    Решил выложить организованный мной метод файлового кеширования в DLE, может кому пригодится :)
    1. Создаем папку /engine/cache/all и ставим на нее права на запись (chmod 777 или 775 в зависимости от хостера).
    2. Открываем index.php и редактируем:
    Находим:
    PHP:
    @session_start ();
    Вставляем после:
    PHP:
    ///////////////Файловое кэширование//////////////
    if($_SESSION['dle_user_id'] == && $_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'] == && $_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: Рад если кому пригодилось :)
     
    designf, Bormaley, oleg_61 и 13 другим нравится это.
  2. z00f

    z00f Создатель

    Регистр.:
    17 апр 2009
    Сообщения:
    32
    Симпатии:
    3
    а что делать с @ob_start(); в начале файла?
    удалить?
     
  3. kodges

    kodges Создатель

    Регистр.:
    16 фев 2007
    Сообщения:
    32
    Симпатии:
    27
    Не надо удалять, пусть будет я не уверен но насколько мне показалось движек где-то потом закрывает свой запуск @ob_start();
    именно поэтому нужно добавить еще один запуск буферизации в указанном в инструкции месте.
    Возможно я ошибаюсь, на нобелевку не претендую :)
    Но мой вариант работает 100%
     
  4. teroor

    teroor Постоялец

    Регистр.:
    1 май 2008
    Сообщения:
    124
    Симпатии:
    18
    GzipOut я не нашёл чёт , на какой строке он ? ;)
     
  5. kodges

    kodges Создатель

    Регистр.:
    16 фев 2007
    Сообщения:
    32
    Симпатии:
    27
    GzipOut (); это последняя строка. У меня например так:
    PHP:
    echo $tpl->result['main'];
    $tpl->global_clear ();
    $db->close ();
    GzipOut ();

    ////////////Файловое кэширование/////////////
    if($_SESSION['dle_user_id'] == && $_SERVER['REQUEST_METHOD'] == "GET")
    {
        
    $pageBuf ob_get_contents();
        
    $fp fopen($FCache"w");
        
    fputs($fp$pageBuf);
        
    fclose($fp);
    }
    /////////////////////////////////////////////
    ?>
     
  6. lift

    lift Читатель

    Заблокирован
    Регистр.:
    1 июл 2007
    Сообщения:
    2.226
    Симпатии:
    1.377
    Данный кеш идет отдельно от основного или вместо него? Тоесть грубо говоря, если я изменю менюшку или баннер, зайду в админку и сброшу кеш то на сайте все обновиться а статьи остануться в ЭТОМ кеше не тронутыми? Или кеш заменяет родной и при обновлении меню нужно его сносить?
     
  7. Dark Angell

    Dark Angell Читатель

    Заблокирован
    Регистр.:
    29 фев 2008
    Сообщения:
    1.035
    Симпатии:
    690
    лифт это отдельный скрипт кеша,который висит на кроне,как задаш крон так и будет сбрасываться время
     
  8. kodges

    kodges Создатель

    Регистр.:
    16 фев 2007
    Сообщения:
    32
    Симпатии:
    27
    Как правильно заметил Dark Angell, этот скрипт файлового кеширования никак не связан с встроенным кешированием DLE, тоесть, если вы в админке жмете "Очистить кеш" то тем самым Вы очищаете только встроенный кеш движка но не файловый кеш.
    Но это совсем не страшно :) Ибо если вы разбираетесь в php то должны заметить что данный скрипт кеширует только страницы для незарегистрированных пользователей получаемых GET запросм, а это значит что как только Вы или любой другой посетитель авторизовался на сайте, то для него сраницы начинают выдаваться не из файлового кеша, а из встроенного кеша либо генерироваться движком с нуля, таким образом Вам как админу все изменения сделанные в шаблоне или где то еще будут отображаться сразу (при условии что встроенный кеш движка обнулен или отключен), а вот все неавторизованные пользователи или иными словами гости, увидят изменения только по мере обновления файлового кеша.
     
  9. Aiweb3

    Aiweb3 Создатель

    Регистр.:
    19 апр 2009
    Сообщения:
    20
    Симпатии:
    0
    а какое посоветуешь оптимальное время поставить жизни кеша если посещаемость к примеру 5-10 к
    то время которое сейчас в твоем коде я думаю будет многово то для сайта с 5-10 к в сутки
     
  10. lift

    lift Читатель

    Заблокирован
    Регистр.:
    1 июл 2007
    Сообщения:
    2.226
    Симпатии:
    1.377
    Dark Angell
    Та я все понял про крон. Ты знаеш мои объемы баз просто, раз в месяц зайду удалю кеш руками. Если не забуду конечно :) Вопрос не в этом.
    kodges
    Простой конкретный вопрос: без сброса твоего кеша незарегеные юзеры (ака поисковики) будут видеть изменения в сапа-ссылках и их аналогах или нет? Мне хватит просто ответа да/нет и все :)
    И второй просто вопрос: пока не удалю кеш кроном/руками он будет болтаться в папке даже при привышении времени
    и просто в папку будет добавлен новый кеш для этой страници, да?

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