День добрый.
Давно планировал написать статью на эту тему и вот, буквально, вчера запустил на своем проекте обновленный вариант — результаты можно считать как минимум интересными. Начну сразу с результатов, а потом уже теория.
Время открытия некоторых страниц:
Главная страница сайта <!--Время генерации страницы: 0.0010 сек.(0 запросов)-->
Страница рубрики <!--Время генерации страницы: 0.0014 сек.(0 запросов)-->
Открытая статья <!--Время генерации страницы: 0.0010 сек.(0 запросов)-->
Список пользователей (/users) <!--Время генерации страницы: 0.0009 сек.(0 запросов)-->
На самом деле, время генерации страницы из кэша не зависит от типа страницы — примеры я привел только для того, чтобы можно было оценить порядок цифр.
Минусы: В данной реализации при загрузке страницы из кэша в таблицу cms_online не записывается гость. Проблема решаема, при желании. Но мне не нравится функция движка, которая за это отвечает(делает лишние запросы) — поэтому я ее убрал вообще.
После включения таймера(таймер оставляем, чтобы в конце увидеть время генерации страницы)
Добавляем код для кэширования (UPDATE переименовал используемые переменные):
И после вывода шаблона
Вставляем код
Ниже этого места находится такой код:
Вместо него вставляем:
Метод setLifeTime устанавливает период обновления кэша.
Метод start проверяет наличия кэша для заданного id страницы (в качестве id я использую URL). Если есть — загружает файл, если нет — начинает записывать.
Метод end записывает результат в файл.
Аяксовые запросы страниц (fullajax) тоже кэшируются. Это можно увидеть в фаербаге.
Ссылки по теме:
Статья на хабре.
И еще источник.
Скачать пакет можно на сайте pear.php.net(тут есть и описание и примеры) — ссылка.
Либо в моих файлах (лишние файлы убрал, оставил только те, что используются) ссылка
2. Закинуть файлы пакета Cache_Lite в папку /cache. Либо в любую другую, предварительно поправив пути в файлах(в файле index.php и в файле Lite/Output.php из пакета).
3. Обновить файл index.php.
4. чтобы выводилось количество запросов — включите в админке режим отладки (тексты запросов выводиться не будут, только их количество)
5. Если будут проблемы с авторизацией — добавить директиву
в файл .htaccess в корне сайта. Это отключит глобальные переменные. Описание зачем это надо сделать
Конечно, нельзя считать на этом тему файлового кэширования контента закрытой. Эта именно та технология, с помощью которой я планировал делать платные оптимизации (здесь я привел самый простой вариант реализации, без каких-либо настроек из админки).
Давно планировал написать статью на эту тему и вот, буквально, вчера запустил на своем проекте обновленный вариант — результаты можно считать как минимум интересными. Начну сразу с результатов, а потом уже теория.
Время открытия некоторых страниц:
Главная страница сайта <!--Время генерации страницы: 0.0010 сек.(0 запросов)-->
Страница рубрики <!--Время генерации страницы: 0.0014 сек.(0 запросов)-->
Открытая статья <!--Время генерации страницы: 0.0010 сек.(0 запросов)-->
Список пользователей (/users) <!--Время генерации страницы: 0.0009 сек.(0 запросов)-->
Группе, к которой вы принадлежите, запрещено просматривать этот скрытый текст
На самом деле, время генерации страницы из кэша не зависит от типа страницы — примеры я привел только для того, чтобы можно было оценить порядок цифр.
Задача:
Определить авторизован пользователь или нет. Для гостей загрузить версию страницы из кэша (который хранится в файле и обновляется с заданным интервалом).Решение (ICMS 1.9):
Для того, чтобы узнать гость зашел или зарегистрированный посетитель я использую проверку по сессиям и кукисам (запросов к базе данных НЕТ). Для запуска кэширования вносятся изменения только в один файл движка, в index.php (файл вложил в архив). Интервал кэширования для гостей ставим 2 часа (7200 секунд). То есть новый контент гости будут видеть именно с такой задержкой.Минусы: В данной реализации при загрузке страницы из кэша в таблицу cms_online не записывается гость. Проблема решаема, при желании. Но мне не нравится функция движка, которая за это отвечает(делает лишние запросы) — поэтому я ее убрал вообще.
После включения таймера(таймер оставляем, чтобы в конце увидеть время генерации страницы)
$inCore->startGenTimer();
if ($inCore->getCookie('userid') || $cl_user_id){ $caching = false;} else {$caching = true;} require_once 'cache/Lite/Output.php'; $where = $_SERVER["REQUEST_URI"]; $noax = $_POST['ax'] != 1; if ($noax!=1){$ax = 1;}else {$ax=0;} if ($ax==1) {$where = $where.'aj__ax/';} if (substr_count($where,"registration")+substr_count($where,"login")+substr_count($where,"logout")!=0) {$caching = false;} // Определяем настройки для Cache_Lite 'cacheDir' => '../icache/', // папка для кэша 'writeControl' => true, //проверка корректности при записи 'readControl' => true, //проверка корректности при чтении 'caching' => $caching, // включено/выключено кэширование 'readControlType' => 'md5' ); // Создаем объект класса Cache_Lite_Output $cl_cache = new Cache_Lite_Output($cl_options); $cl_cache->setLifeTime(7200); //2 часа $fromcache = 1; if (!$cl_cache->start($where, 'all')) { $fromcache = 0;
$inPage->showTemplate(); }
} //закрыли кэширование
////////////// Вычисляем и выводим время генерации, запросы к базе ///////////// if ($inDB->q_count && $inConf->debug) { $time = $inCore->getGenTime(); echo ' '.$_LANG['DEBUG_QUERY_DB']; echo ' '.$inDB->q_count.' '; echo $inDB->q_dump; } //////////////////////// Очищаем временные переменные ////////////////////////// $inCore->clearSessionTrash();
$time = $inCore->getGenTime(); if ($fromcache){ } else { echo '<!--'.$_LANG['DEBUG_TIME_GEN_PAGE'].' '.number_format($time, 4).' '.$_LANG['DEBUG_SEC'].'('.$inDB->q_count.' запросов)'.'-->'; $inCore->clearSessionTrash(); }
Поясню некоторые моменты.
Кэширование осуществляется методами класса Cache_Lite_Output (из пакета Pear::Cache_Lite)Метод setLifeTime устанавливает период обновления кэша.
Метод start проверяет наличия кэша для заданного id страницы (в качестве id я использую URL). Если есть — загружает файл, если нет — начинает записывать.
Метод end записывает результат в файл.
Аяксовые запросы страниц (fullajax) тоже кэшируются. Это можно увидеть в фаербаге.
Ссылки по теме:
Статья на хабре.
И еще источник.
Скачать пакет можно на сайте pear.php.net(тут есть и описание и примеры) — ссылка.
Либо в моих файлах (лишние файлы убрал, оставил только те, что используются) ссылка
Порядок установки:
1. Создать папку icache с правами на 777 на один уровень выше сайта (можно выбрать другое имя и путь расположения, но нужно будет поправить в настройках "cacheDir")2. Закинуть файлы пакета Cache_Lite в папку /cache. Либо в любую другую, предварительно поправив пути в файлах(в файле index.php и в файле Lite/Output.php из пакета).
3. Обновить файл index.php.
4. чтобы выводилось количество запросов — включите в админке режим отладки (тексты запросов выводиться не будут, только их количество)
5. Если будут проблемы с авторизацией — добавить директиву
php_flag register_globals Off
Конечно, нельзя считать на этом тему файлового кэширования контента закрытой. Эта именно та технология, с помощью которой я планировал делать платные оптимизации (здесь я привел самый простой вариант реализации, без каких-либо настроек из админки).
Реклама #
ivanish 12 лет назад #
А кто хостер и какой тариф?
letsgo 12 лет назад #
letsgo 12 лет назад #
В папке сайта создавать нельзя?
SJen 12 лет назад #
но технически можно и в папке сайта (если по какой-то причине мой вариант не подходит). Главное путь поправить в настройках
ivanish 12 лет назад #
SJen 12 лет назад #
Сейчас поправлю топик.
ivanish 12 лет назад #
SJen 12 лет назад #
Тут все очень просто работает - формируется html и записывается в файл, потом просто подгружается из файла.
Должно отображаться все в точности как в сформированном html. Разница в том, что не подрубается php и база данных - открывается готовый вариант.
ivanish 12 лет назад #
http://new.kznmed.ru/maps
Есть возможность вывести его из под кеша?
Хотя бы так?
SJen 12 лет назад #
Dorimen 12 лет назад #
ivanish 12 лет назад #
SJen 12 лет назад #
Если под админом не работает скрипт, то может дело в скрипте?
ivanish 12 лет назад #
SJen 12 лет назад #
можно переименовать все переменные. Добавить префикс.
ivanish 12 лет назад #
SJen 12 лет назад #
$caching
$options
$fromcache
их можно назменить на
$cl_caching
$cl_options
$cl_fromcache
Но это может и не помочь, я не знаю в чем причина отказа компонента Maps. У меня его нет, на нем я не проверял работу. Думаю проблема может быть в том, что он как-то реагирует на переменные - поменяйте имена, будет видно.
ivanish 12 лет назад #
SJen 12 лет назад #
можно переименовать все переменные. Добавить префикс.
letsgo 12 лет назад #
ivanish 12 лет назад #
letsgo 12 лет назад #
SJen 12 лет назад #
letsgo 12 лет назад #
SJen 12 лет назад #
Чем меньше период, тем чаще будет перезаписываться кэш - если сайт очень часто обновляемый, то стоит время выбирать поменьше. Это зависит от конкретного проекта, "идеального периода" не существует.
Можно пойти дальше и главную страницу обновлять раз в 10 минут (чтобы поисковые роботы быстро съедали новые страницы), а остальные, например, раз в 10 часов.
Alex9 11 лет назад #
Alex9 11 лет назад #
letsgo 12 лет назад #
letsgo 12 лет назад #
SJen 12 лет назад #
или они как-то отдельно грузятся?
надо смотреть код, вообще ничего пропадать не должно - оно же просто записывается в файл, откуда потом и достается. Тизеры, гугл адсенс, ЯД и тд - у меня все работает прекрасно. Кидайте в личку, я посмотрю и смогу ответить. Может они как-то особенно формируются, что не попадают в закешированный файл
fact 12 лет назад #
letsgo 12 лет назад #
SJen 12 лет назад #
fact 12 лет назад #
Создал папку на уровень выше сайта- права 777
В папку cahe - закинул всё файлы которые были в вашем архиве (папку Lite, index.php, Lite.php)
- нужно было все файлы кидать?
Где именно обновить index.php
во общем не совсем понял какие файлы из архива куда кидать и какой индекс обновлять или можно просто взять из архива
SJen 12 лет назад #
ЛИБО, вручную внести в свой файл изменения, как прописано в топике.
А все остальные файлы положить в папку cache в корне сайта (папку Lite и Lite.php).
Amurland 12 лет назад #
letsgo 12 лет назад #
1. Создаю папку выше уровнем сайта, сделал одну для всех поэтому потом в индексе путь пишу
'cacheDir' => '../obshaya/site1cashe/', // папка для кэша
2. Папку Lite кидаем в кеш сайта, туда же в кеш lite.php
3. Меняем индексе код, название и путь обязательно пишем папки, которую сделали в пункте 1.
Все работает.
letsgo 12 лет назад #
SJen 12 лет назад #
lezginka.ru 12 лет назад #
SJen 12 лет назад #
Сейчас вот появилась мысль логировать время генерации страниц в какой-то файл (запись в файл будет работать быстрее, чем запись в БД) - а потом этот файлик обработать и посмотреть что внутри.
Евгений 12 лет назад #
SJen 12 лет назад #
Вот например на этой странице (http://instantcms.ru/blogs/poleznosti-ot-sjen/kyeshirovanie-teorija-i-praktika-chast-1.html#comment_33915):
<!-- Время генерации страницы:: 0.0688 сек. -->
bondar 12 лет назад #
SJen 12 лет назад #
для 1.7 нужно вручную внести то, что я прописал.
и в конце, там где выводится время и количество запросов - можно убрать этот блок. Это исключит вероятность ошибок (их могут вызывать вызов функций, которых тогда еще не было)
bondar 12 лет назад #
Уже разобрался, просто папку не закинул)), он на нее ссылается , и выдает ошибку, говоря что ее нет
GarikKR 12 лет назад #
SJen 12 лет назад #
для юзеров никакой задержки.
Есть еще возможность убивать кэш для какой-то конкретной страницы (например, если для нее добавлен коммент). Для этого надо копнуть глубже, я показал самый простой вариант реализации - без ковыряния движка.
GarikKR 12 лет назад #
Def 12 лет назад #
другое дело, когда входишь в карточку. да и там только Я ЗДЕСЬ бЫЛ, новости и афиша событий могут меняться.
GarikKR 12 лет назад #
GarikKR 12 лет назад #
SJen 12 лет назад #
Для админа тоже кэш не работает, кэш только для гостей. Но если у вас это ломает комментирование или еще что-то, то, конечно, убирайте.
GarikKR 12 лет назад #
SJen 12 лет назад #
GarikKR 12 лет назад #
bondar 12 лет назад #
SJen 12 лет назад #
Дизайн вообще не должен как-то пострадать, над ним нет никаких операций. Да и какая разница какой браузер если кэш внедряется в php - всю работу выполняет сервер. Если он и ломает сайт, то это должно быть во всех браузерах, а не в каком-то отдельном.
У меня самого версия 1.9 и ничего из перечисленных багов я у себя не наблюдаю. Ни поехавшего дизайна, "ни админа без авторизации". Все работает уже более суток в таком формате.
bondar 12 лет назад #
SJen 12 лет назад #
bondar 12 лет назад #
SJen 12 лет назад #
надо ваши скрипты смотреть - вполне можно написать так, что будет работать везде одинаково
Дмитрий 12 лет назад #
letsgo 12 лет назад #
SJen 12 лет назад #
Сейчас и в IE нормально смотрится (смотрел в IE8).
Дмитрий 12 лет назад #
GarikKR 12 лет назад #
ivanish 12 лет назад #
letsgo 12 лет назад #
SJen 12 лет назад #
Дмитрий 12 лет назад #
И после ввода логин пароля открывается пустая страница www.сайт/login
SJen 12 лет назад #
Описание зачем это надо сделать
KS 12 лет назад #
Там весь вывод списка объектов строится на этом.
Например если закешировать модуль Новости в Мапсе, то новости увидите только того города который в кеше!
Зайдет человек с другого города - увидит тоже самое ..
В кеше будет записана инфо только по одному параметру.
Т.е. Меняя параметры, например на карте где динамично меняются маркеры , они уже будут глючить.
Много запросов в мапсе можно убрать переделав вывод рубрик .
У себя убрал полностью обычный вывод рубрик и сделал его под кешем в модуле. В итоге запросы на главной мапса упали с 420 до 2. )
SJen 12 лет назад #
Компонент же закодирован, с ним ничего сделать не получится. Да и неправильно его модифицировать самостоятельно - потом при обновлении будут проблемы.
universe 12 лет назад #
SJen 12 лет назад #
universe 12 лет назад #
SJen 12 лет назад #
KS 12 лет назад #
тогда можно делать все что угодно..
SJen 12 лет назад #
• Mike • 12 лет назад #
Smarty не устраивает? (встроенная система кэширования шаблонов)…
SJen 12 лет назад #
Мало кэшировать только шаблоны, это не решает все проблемы с большой нагрузкой..
• Mike • 12 лет назад #
SJen 12 лет назад #
KS 12 лет назад #
Скоро наверно скачаю, займусь модернизацией ,)
Это самая нужная полезность ! Спасибо!
KS 12 лет назад #
точней могу, но это много времени нужно ..
ivanish 12 лет назад #
GarikKR 12 лет назад #
SJen 12 лет назад #
Я смотрел один сайт, у которого в IE едет шаблон - но там были косяки в верстке.
Если код такой же, то нет причин того, чтобы в каком-то браузере открывался сайт по-другому.. надо смотреть конкретный пример, тогда смогу ответить какая причина.
Зекабрист 12 лет назад #
Но теперь при авторизации попадаю на белую станицу тоже самое при выходе. В файл htaccess в корне сайта все добавил
SJen 12 лет назад #
на нескольких сайтах такое видел
На других же с кешированием таких проблем нет. Но есть проблема с IE.
letsgo 12 лет назад #
SJen 12 лет назад #
Иван Шкута 12 лет назад #
SJen 12 лет назад #
Иван Шкута 12 лет назад #
SJen 12 лет назад #
ну если такое есть, тогда все возможно)
Значит у меня шаблон без таких интересностей, потому что никаких проблем с отображением в разных браузерах не наблюдал у себя
Иван Шкута 12 лет назад #
Давно интересовал такой вопрос: при кэшировании страницы, рандомные ее части перестают меняться? Например случайное фото или случайное из каталога, которые изменяются при каждой перезагрузке страницы.
SJen 12 лет назад #
На самом деле ответ не так прост - вопрос в организации "рандома". Если "случайность" определяет php - тогда, конечно, меняться ничего не будет - потому что php тут не подрубается, а берется просто копия html страницы, сформированная ранее. Если "случайностью" управляет javascript (обычный скрипт или аякс) - то, конечно, будет меняться случайное фото и тд..
Иван Шкута 12 лет назад #
KS 12 лет назад #
был глюк с модулем который подключал js с внешнего файла , js маленький, поэтому я его в тело модуля засунул и отключил внешний. После этого , при включении кеша (смарти), у модуля в ИЕ сносило крышу ..
Иван Шкута 12 лет назад #
Иван Шкута 12 лет назад #
SJen 12 лет назад #
Иван Шкута 12 лет назад #
Строку (в оригинале 55 строка):
SJen 12 лет назад #
я же типа оптимизировал, минимизировал работу сервера - в чем фишка загружать сервер еще чем-то, добавляя ему работы?
Иван Шкута 12 лет назад #
maia 12 лет назад #
SJen 12 лет назад #
VLADIMIR 12 лет назад #
и вопрос а можно защитить эту папку в целях безопастности с помощью .htaccess
SJen 12 лет назад #
Санечек 12 лет назад #
Def 12 лет назад #
bondar 12 лет назад #
Apokalipsis 12 лет назад #
Агроном 12 лет назад #
Aleksandr 12 лет назад #
Aleksandr 11 лет назад #
SJen 11 лет назад #
Cruzka 11 лет назад #
Круто, спасибо! то что надо
Cruzka 11 лет назад #
Круто, спасибо! то что надо
SJen 11 лет назад #
cvetkoff 11 лет назад #
SJen 11 лет назад #
надо подправлять файлы компонента, там выводится проверяется номер сессии - который в данном случае не нужен.
Def 11 лет назад #
SJen 11 лет назад #
Def 11 лет назад #
Def 11 лет назад #
SJen 11 лет назад #
Если только хакнуть db.class.php - то есть перехватывать запросы на update таблиц и соответственно обновлять кэш (какой именно кэш и какого модуля - надо узнавать в какой-то спец таблице, которая будет хранить привязку модуля к таблице mysql). Можно, конечно, сделать
Def 11 лет назад #