Кэширование, теория и практика (часть 1)

+64
8.44K
День добрый.

Давно планировал написать статью на эту тему и вот, буквально, вчера запустил на своем проекте обновленный вариант — результаты можно считать как минимум интересными. Начну сразу с результатов, а потом уже теория.

Время открытия некоторых страниц:
Главная страница сайта <!--Время генерации страницы: 0.0010 сек.(0 запросов)-->
Страница рубрики <!--Время генерации страницы: 0.0014 сек.(0 запросов)-->
Открытая статья <!--Время генерации страницы: 0.0010 сек.(0 запросов)-->
Список пользователей (/users) <!--Время генерации страницы: 0.0009 сек.(0 запросов)-->


Группе, к которой вы принадлежите, запрещено просматривать этот скрытый текст


На самом деле, время генерации страницы из кэша не зависит от типа страницы — примеры я привел только для того, чтобы можно было оценить порядок цифр.

Задача:

Определить авторизован пользователь или нет. Для гостей загрузить версию страницы из кэша (который хранится в файле и обновляется с заданным интервалом).

Решение (ICMS 1.9):

Для того, чтобы узнать гость зашел или зарегистрированный посетитель я использую проверку по сессиям и кукисам (запросов к базе данных НЕТ). Для запуска кэширования вносятся изменения только в один файл движка, в index.php (файл вложил в архив). Интервал кэширования для гостей ставим 2 часа (7200 секунд). То есть новый контент гости будут видеть именно с такой задержкой.

Минусы: В данной реализации при загрузке страницы из кэша в таблицу cms_online не записывается гость. Проблема решаема, при желании. Но мне не нравится функция движка, которая за это отвечает(делает лишние запросы) — поэтому я ее убрал вообще.

После включения таймера(таймер оставляем, чтобы в конце увидеть время генерации страницы)
  1. $inCore->startGenTimer();
Добавляем код для кэширования (UPDATE переименовал используемые переменные):
  1.  
  2. $cl_user_id = isset($_SESSION['user']['id']) ? $_SESSION['user']['id'] : 0;
  3. if ($inCore->getCookie('userid') || $cl_user_id){ $caching = false;} else {$caching = true;}
  4. require_once 'cache/Lite/Output.php';
  5. $where = $_SERVER["REQUEST_URI"];
  6. $noax = $_POST['ax'] != 1; if ($noax!=1){$ax = 1;}else {$ax=0;}
  7. if ($ax==1) {$where = $where.'aj__ax/';}
  8. if (substr_count($where,"registration")+substr_count($where,"login")+substr_count($where,"logout")!=0)
  9. {$caching = false;}
  10. // Определяем настройки для Cache_Lite
  11. $cl_options = array(
  12. 'cacheDir' => '../icache/', // папка для кэша
  13. 'writeControl' => true, //проверка корректности при записи
  14. 'readControl' => true, //проверка корректности при чтении
  15. 'caching' => $caching, // включено/выключено кэширование
  16. 'readControlType' => 'md5'
  17. );
  18.  
  19. // Создаем объект класса Cache_Lite_Output
  20. $cl_cache = new Cache_Lite_Output($cl_options);
  21. $cl_cache->setLifeTime(7200); //2 часа
  22. $fromcache = 1;
  23. if (!$cl_cache->start($where, 'all')) {
  24. $fromcache = 0;
  25.  
И после вывода шаблона
  1. $inPage->showTemplate();
  2. }
Вставляем код
  1. $cl_cache->end();
  2. } //закрыли кэширование
Ниже этого места находится такой код:
  1. ////////////// Вычисляем и выводим время генерации, запросы к базе /////////////
  2.  
  3. if ($inDB->q_count && $inConf->debug) {
  4. $time = $inCore->getGenTime();
  5. echo $_LANG['DEBUG_TIME_GEN_PAGE'].' '.number_format($time, 4).' '.$_LANG['DEBUG_SEC'];
  6. echo '
  7. '.$_LANG['DEBUG_QUERY_DB'];
  8. echo ' '.$inDB->q_count.'
  9. ';
  10. echo $inDB->q_dump;
  11. }
  12. //////////////////////// Очищаем временные переменные //////////////////////////
  13. $inCore->clearSessionTrash();
Вместо него вставляем:
  1. $time = $inCore->getGenTime();
  2. if ($fromcache){
  3. echo '<!--Время генерации страницы: '.number_format($time, 4).' сек.(0 запросов)'.'-->';
  4. }
  5. else {
  6. echo '<!--'.$_LANG['DEBUG_TIME_GEN_PAGE'].' '.number_format($time, 4).' '.$_LANG['DEBUG_SEC'].'('.$inDB->q_count.' запросов)'.'-->';
  7. $inCore->clearSessionTrash();
  8. }
  9.  

Поясню некоторые моменты.

Кэширование осуществляется методами класса 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. Если будут проблемы с авторизацией — добавить директиву
  1. php_flag register_globals Off
в файл .htaccess в корне сайта. Это отключит глобальные переменные. Описание зачем это надо сделать

Конечно, нельзя считать на этом тему файлового кэширования контента закрытой. Эта именно та технология, с помощью которой я планировал делать платные оптимизации (здесь я привел самый простой вариант реализации, без каких-либо настроек из админки).
+1
ivanish ivanish 12 лет назад #
Ваш сайт просто летает!!!
А кто хостер и какой тариф?
0
letsgo letsgo 12 лет назад #
Может благодаря кешу, или вы только начало читали?
-1
letsgo letsgo 12 лет назад #
Sjen:
Создать папку icache с правами на 777 на один уровень выше сайта (можно выбрать другое имя и путь расположения, но нужно будет поправить в настройках "cacheDir")

В папке сайта создавать нельзя?
+2
SJen SJen 12 лет назад #
я в целях безопасности предпочитаю хранить ее не в папке сайта
но технически можно и в папке сайта (если по какой-то причине мой вариант не подходит). Главное путь поправить в настройках
Код PHP:
'cacheDir'        => '../icache/', // папка для кэша
ivanish, дело не в хостинге, поверьте)
+1
ivanish ivanish 12 лет назад #
Я читал и уже сделал у себя. Правда у меня все время показывает 0 запросов, даже для новых стр.
+1
SJen SJen 12 лет назад #
точно, не написал - включите в админке "режим отладки", чтобы считалось количество запросов.
Сейчас поправлю топик.
+1
ivanish ivanish 12 лет назад #
Обнаружил проблему - с компонентом Maps не выводит маркеры.
+1
SJen SJen 12 лет назад #
надо смотреть конкретный сайт.
Тут все очень просто работает - формируется html и записывается в файл, потом просто подгружается из файла.
Должно отображаться все в точности как в сформированном html. Разница в том, что не подрубается php и база данных - открывается готовый вариант.
+1
ivanish ivanish 12 лет назад #
Скорее всего скрипт какой-либо :(
http://new.kznmed.ru/maps

Есть возможность вывести его из под кеша?
Хотя бы так?
0
SJen SJen 11 лет назад #
нужно добавить еще одно условие
Код PHP:
substr_count($where,"maps")
в строку, где исключается страница регистрации. Написал в личку подробней как должно быть.
0
Dorimen Dorimen 11 лет назад #
SJen, а мне напишите, пожалуйста - тоже с мапсом проблема. Спасибо!
+1
ivanish ivanish 12 лет назад #
Оказывается, что для гостей, что для админа - одинаково
+1
SJen SJen 12 лет назад #
для админа кэш не включается (как и для любого авторизованного юзера)
Если под админом не работает скрипт, то может дело в скрипте?
+1
ivanish ivanish 12 лет назад #
Посмотрел, убирая в index блок про кеширование - все ок, возвращаю - нет маркеров.
0
SJen SJen 12 лет назад #
может какая-то из моих переменных с чем-то пересекается..
можно переименовать все переменные. Добавить префикс.
0
ivanish ivanish 12 лет назад #
Если не сложно, это какой файл? И где добавлять?
0
SJen SJen 12 лет назад #
у меня только один файл меняется - index.php, вот в нем переменные есть
$caching
$options
$fromcache

их можно назменить на
$cl_caching
$cl_options
$cl_fromcache

Но это может и не помочь, я не знаю в чем причина отказа компонента Maps. У меня его нет, на нем я не проверял работу. Думаю проблема может быть в том, что он как-то реагирует на переменные - поменяйте имена, будет видно.
0
ivanish ivanish 12 лет назад #
Не помогло. Напишу в поддержку.
0
SJen SJen 12 лет назад #
может какая-то из моих переменных с чем-то пересекается..
можно переименовать все переменные. Добавить префикс.
-1
letsgo letsgo 12 лет назад #
message = Cache_Lite : Unable to write cache file : ../oncash/cache_a181a603769c1f98ad927e7367c7aa51_6666cd76f96956469e7be39d750cc7d9message = Cache_Lite : Unable to read cache !
+1
ivanish ivanish 12 лет назад #
Уберите .../ - или только слеш. У разных хостеров различно.
-1
letsgo letsgo 12 лет назад #
Спасибо сделал, была генерация 0.4 стала Время генерации страницы: 0.0052 сек.(0 запросов)
+1
SJen SJen 12 лет назад #
ну вот, теперь и вы превратитесь в ходячую рекламу своего хостинга, начнут спрашивать "что за тариф и как зовут хостера"))
-1
letsgo letsgo 12 лет назад #
Жду вторую часть) два сайта уже сделал, загрузку теперь отслежу по Гуглу. Кстати, если поставить 20 минут на кеш, каковы будут результаты?
+1
SJen SJen 12 лет назад #
Время стоит выбирать в зависимости от того, как часто обновляется ваш контент. Если, скажем, одна статья в день и два комментария в день - то можно поставить и 12 часов для кэша. Какой смысл обновлять чаще? - да и это же все применительно только к гостям, посетители никак не пострадают - для них всегда актуальная версия открывается.

Чем меньше период, тем чаще будет перезаписываться кэш - если сайт очень часто обновляемый, то стоит время выбирать поменьше. Это зависит от конкретного проекта, "идеального периода" не существует.

Можно пойти дальше и главную страницу обновлять раз в 10 минут (чтобы поисковые роботы быстро съедали новые страницы), а остальные, например, раз в 10 часов.
0
Alex9 Alex9 11 лет назад #
А Где именно нужно "../ - или только слеш" ?
0
Alex9 Alex9 11 лет назад #
Где именно нужно Убрать "../ - или только слеш" :)
-1
letsgo letsgo 12 лет назад #
Нда один момент появился)) рекламные баннеры то пропали. Как их вывести из кеширования? Получается для зарегенных есть реклама, для гостей нету.
0
letsgo letsgo 12 лет назад #
Вопрос снимаю, все работает. Хотя сначала встала реклама.
+2
SJen SJen 12 лет назад #
пропали.. странно, а разве их нет в исходном коде?
или они как-то отдельно грузятся?

надо смотреть код, вообще ничего пропадать не должно - оно же просто записывается в файл, откуда потом и достается. Тизеры, гугл адсенс, ЯД и тд - у меня все работает прекрасно. Кидайте в личку, я посмотрю и смогу ответить. Может они как-то особенно формируются, что не попадают в закешированный файл
+1
fact fact 12 лет назад #
А если на уровень выше сайта находится другой сайт- это повлияет на безопасность? Как лучше сделать?
0
letsgo letsgo 12 лет назад #
Я сделал так, создал в корне где папки сайтов 1 папку назвать её можно например sitecash и в неё уже поместил все кеш папки сайтов.
0
SJen SJen 12 лет назад #
Да можно и в корне сайта создать папку - InstantCMS сам так кэширует, в папку в корне сайта
0
fact fact 12 лет назад #
значит я сделал следующее.
Создал папку на уровень выше сайта- права 777
В папку cahe - закинул всё файлы которые были в вашем архиве (папку Lite, index.php, Lite.php)
- нужно было все файлы кидать?

Где именно обновить index.php

во общем не совсем понял какие файлы из архива куда кидать и какой индекс обновлять или можно просто взять из архива
0
SJen SJen 12 лет назад #
мой файл index.php положить в папку с сайтом (заменить тот, что есть).

ЛИБО, вручную внести в свой файл изменения, как прописано в топике.

А все остальные файлы положить в папку cache в корне сайта (папку Lite и Lite.php).
+1
Amurland Amurland 12 лет назад #
Интересная штука. Скоро попробую.
+1
letsgo letsgo 12 лет назад #
Я так сделал.

1. Создаю папку выше уровнем сайта, сделал одну для всех поэтому потом в индексе путь пишу

'cacheDir' => '../obshaya/site1cashe/', // папка для кэша

2. Папку Lite кидаем в кеш сайта, туда же в кеш lite.php

3. Меняем индексе код, название и путь обязательно пишем папки, которую сделали в пункте 1.

Все работает.
0
letsgo letsgo 12 лет назад #
у кого стоит очистка кеша, лучше lite.php кидать в корень меняя путь в Lite/Output.php а то после очистки кеша, сайт не открывается.
0
SJen SJen 12 лет назад #
я бы предложил кидать в специальную папку, создать например "Cache_Lite" в корне сайта, и пути поправить. В корень не совсем "красиво", вдруг еще забудете что это за файл и удалите)
0
lezginka.ru lezginka.ru 12 лет назад #
SJen, не помешало инструкция, для чайников "как определить наиболее загружаемые страницы"(какие страницы долго грузятся)
+2
SJen SJen 12 лет назад #
я их ищу методом тыка - просто гуляю по сайту и смотрю строку с временем генерации. Не думаю, что это стоит как-то автоматизировать - не так много типовых страниц, можно и так их обойти. Знаю, например, что карта долго грузится из-за огромного количества запросов (компонент Maps).

Сейчас вот появилась мысль логировать время генерации страниц в какой-то файл (запись в файл будет работать быстрее, чем запись в БД) - а потом этот файлик обработать и посмотреть что внутри.
0
Евгений Евгений 11 лет назад #
Все сделал как написано, работает, но не отображается счетчик запросов, хоть и поставил режим отладки
0
SJen SJen 11 лет назад #
ну строго говоря он и не отображается, это закомментированная строка на странице html. Ее можно увидеть, посмотрев исходный код страницы. В самом низу, после </html>

Вот например на этой странице (http://instantcms.ru/blogs/poleznosti-ot-sjen/kyeshirovanie-teorija-i-praktika-chast-1.html#comment_33915):

<!-- Время генерации страницы:: 0.0688 сек. -->
0
bondar bondar 11 лет назад #
ставил кто на 1.7 ?? вылазят ошибки(((((
0
SJen SJen 11 лет назад #
вы пытаетесь запихать в инстант 1.7 мой файл index.php? - если так, то не стоит
для 1.7 нужно вручную внести то, что я прописал.

и в конце, там где выводится время и количество запросов - можно убрать этот блок. Это исключит вероятность ошибок (их могут вызывать вызов функций, которых тогда еще не было)
0
bondar bondar 11 лет назад #
нет конечно)), я вручную вносил. Я вообще всегда сверяю WinMerge , и вношу вручную, не люблю слепые замены файлов))

Уже разобрался, просто папку не закинул)), он на нее ссылается , и выдает ошибку, говоря что ее нет
0
GarikKR GarikKR 11 лет назад #
Это получается и комментарии будут видны только через два часа?
0
SJen SJen 11 лет назад #
для гостей да, с задержкой будут видны комментарии
для юзеров никакой задержки.

Есть еще возможность убивать кэш для какой-то конкретной страницы (например, если для нее добавлен коммент). Для этого надо копнуть глубже, я показал самый простой вариант реализации - без ковыряния движка.
+1
GarikKR GarikKR 11 лет назад #
У вас на сайте все нормально работает,у меня не выйти с сайта
0
Def Def 11 лет назад #
да, мапса ест по 100-110 запросов на страницу. не понимаю почему разрабы не кэшируют данные карты после внесения изменений через админку. ведь инфа то вообще не меняется в каталоге карты.

другое дело, когда входишь в карточку. да и там только Я ЗДЕСЬ бЫЛ, новости и афиша событий могут меняться.
0
GarikKR GarikKR 11 лет назад #
С сайта тоже не выйти!Записи на стену и комментарии не добавляются,я так понял это вариант где люди общаются не пойдет((
0
GarikKR GarikKR 11 лет назад #
Я под админом захожу нечего не где не добавить,и с сайта не выйти
0
SJen SJen 11 лет назад #
я так понял это вариант где люди общаются не пойдет((
Неправильный вывод. Проверил у себя - прекрасно можно авторизоваться и выйти с сайта. Комментарии все добавляются, юзеры общаются - юзерам это вообще никак не мешает, для них кэш не работает.

Для админа тоже кэш не работает, кэш только для гостей. Но если у вас это ломает комментирование или еще что-то, то, конечно, убирайте.
0
GarikKR GarikKR 11 лет назад #
Да у вас работает,что может быть подскажите пожалуйста
0
SJen SJen 11 лет назад #
если версия инстанта не 1.9, то изменения в файл index.php нужно вносить вручную. Мой вариант файла для 1.9. И можно проверить кэшируется ли сайт для авторизованных юзеров (посмотреть количество запросов, должно быть НЕ 0).
0
GarikKR GarikKR 11 лет назад #
Изменения вносил вручную,версия 1.9,с другого браузера заходишь попадешь без авторизации под админом,IE Перекасил дизайн до не узнаваемости.
0
bondar bondar 11 лет назад #
да в IE есть такое, перекосил тоже весь сайт, IE 8
0
SJen SJen 11 лет назад #
GarikKR, krz могу объяснить только некорректным обновлением файла index.php. Можете кинуть мне файл после ваших обновлений вручную.

Дизайн вообще не должен как-то пострадать, над ним нет никаких операций. Да и какая разница какой браузер если кэш внедряется в php - всю работу выполняет сервер. Если он и ломает сайт, то это должно быть во всех браузерах, а не в каком-то отдельном.

У меня самого версия 1.9 и ничего из перечисленных багов я у себя не наблюдаю. Ни поехавшего дизайна, "ни админа без авторизации". Все работает уже более суток в таком формате.
0
bondar bondar 11 лет назад #
ну вы то IE со всеми браузерами не ровняйте, это эксклюзив . У меня например скрипт времени на сайте работает во всех браузер, в IE нет, так что тут ничего удивительного, у него свои правила, своя жизнь)
0
SJen SJen 11 лет назад #
krz, то есть у вас шаблон сайта не кроссбраузерный?)) ну тут никакое кэширование не исправит тогда.. Я то имел ввиду, что всем браузерам отдается одинаковый html код - но если этот html кривой и неправильно открывается в каком-то браузере, то он и будет открываться неправильно - кэш это или нет, не важно.
0
bondar bondar 11 лет назад #
шаблон везде отображает одинаково, и в IE тоже, просто есть мелкие заморочки, а после добавки кода в индекс во всех нормально отображает, а в ие сразу слетает, код убираю - и все становится нормально, с чем связано тоже не пойму, поскольку там как и говорили ничего подобного к внешнему виду нет)) Разберусь думаю
0
SJen SJen 11 лет назад #
krz, проверил в IE свои таймеры по времени - все прекрасно работает)
надо ваши скрипты смотреть - вполне можно написать так, что будет работать везде одинаково
0
Дмитрий Дмитрий 11 лет назад #
Ваш сайт в IE8 тоже расплылся. Если надо, могу сделать скрин. Так что пока повременю с хаком )
0
letsgo letsgo 11 лет назад #
да печенюка в ИЕ искорежена
0
SJen SJen 11 лет назад #
посмотрел, это никак не связано с кешем - ослик плохо переваривает некоторые вещи, но и с ним я уже договорился. Не ломает сайт.

Сейчас и в IE нормально смотрится (смотрел в IE8).
0
Дмитрий Дмитрий 11 лет назад #
Да, сейчас ок.
0
GarikKR GarikKR 11 лет назад #
Перекачал архив , все работает как положено.В IE карежет до не узнаваемости,в чем причина не пойму
0
ivanish ivanish 11 лет назад #
Скрипты JS - с ними что-то не так
+2
letsgo letsgo 11 лет назад #
Да в ИЕ корежит сайт очень сильно.
0
SJen SJen 11 лет назад #
а если по коду посмотреть, из-за чего в IE ломается дизайн? - смотрю свой шаблон, открывается одинаково во всех браузерах
0
Дмитрий Дмитрий 11 лет назад #
Привет всем. У меня тож не отображаются метки в инстант мапс. вышеизложенные варианты решения проблемы пробовал=(
И после ввода логин пароля открывается пустая страница www.сайт/login
+1
SJen SJen 11 лет назад #
добавил пятый пункт (как убрать register_globals).
Описание зачем это надо сделать
0
KS KS 11 лет назад #
В Мапсе при входе в любую рубрику идет обработка по городу и другим фильтрам. Его нужно как то отдельно кешировать.
Там весь вывод списка объектов строится на этом.
Например если закешировать модуль Новости в Мапсе, то новости увидите только того города который в кеше!
Зайдет человек с другого города - увидит тоже самое ..
В кеше будет записана инфо только по одному параметру.
Т.е. Меняя параметры, например на карте где динамично меняются маркеры , они уже будут глючить.

Много запросов в мапсе можно убрать переделав вывод рубрик .
У себя убрал полностью обычный вывод рубрик и сделал его под кешем в модуле. В итоге запросы на главной мапса упали с 420 до 2. )
0
SJen SJen 11 лет назад #
это лучше в техподдержку компонента написать)
Компонент же закодирован, с ним ничего сделать не получится. Да и неправильно его модифицировать самостоятельно - потом при обновлении будут проблемы.
0
universe universe 11 лет назад #
можно сделать отмену кеширования определенных страниц =)
0
SJen SJen 11 лет назад #
да, у меня в примере и прописаны исключения некоторых страниц - регистрация, авторизация..
0
universe universe 11 лет назад #
сделаете что бы любой урл вставить? для не разбирающихся в php))
0
SJen SJen 11 лет назад #
позже.. если делать настройки по исключениям, то уже нормально их выводить в админку надо - иначе в коде мусорка будет
0
KS KS 11 лет назад #
А есть ли возможность кешировать вывод отдельных переменных?
тогда можно делать все что угодно..
+1
SJen SJen 11 лет назад #
можно и результаты функций кэшировать - можно много всего с этим пакетом делать. Хорошо было бы подготовить настраиваемое решение с гибкими настройками для инстанта - но я пока другим занят)
0
• Mike • • Mike • 11 лет назад #
…«Хорошо было бы подготовить настраиваемое решение с гибкими настройками для инстанта»…
Smarty не устраивает? (встроенная система кэширования шаблонов)…
0
SJen SJen 11 лет назад #
Smarty кэширует шаблоны, а я имею ввиду кэширование сотни запросов при открытии каждой страницы. Тут я привел очень простой вариант почти без настроек, без сброса кэша, без обновления кэша для нужной страницы..

Мало кэшировать только шаблоны, это не решает все проблемы с большой нагрузкой..
0
SJen SJen 11 лет назад #
К смарти претензий нет) Кэшировать функции движка надо, которые вызываются ДО смарти
0
KS KS 11 лет назад #
Это то что надо ! Можно с мапса самолет сделать ! Не говоря про остальное ..
Скоро наверно скачаю, займусь модернизацией ,)
Это самая нужная полезность ! Спасибо!
0
KS KS 11 лет назад #
уже ) .. Не могу обновить мапс дальше 1.8
точней могу, но это много времени нужно ..
0
ivanish ivanish 11 лет назад #
А расскажите всем - как?
0
GarikKR GarikKR 11 лет назад #
Проблемы с IE так и остались,по коду все тоже самое ,а шаблон ломается((
0
SJen SJen 11 лет назад #
закиньте в личку ссылку на сайт.
Я смотрел один сайт, у которого в IE едет шаблон - но там были косяки в верстке.
Если код такой же, то нет причин того, чтобы в каком-то браузере открывался сайт по-другому.. надо смотреть конкретный пример, тогда смогу ответить какая причина.
0
Зекабрист Зекабрист 11 лет назад #
instant 1.9 все сделал как написано .
Но теперь при авторизации попадаю на белую станицу тоже самое при выходе. В файл htaccess в корне сайта все добавил
0
SJen SJen 11 лет назад #
отключайте кэш, не могу пока ответить почему так
на нескольких сайтах такое видел
На других же с кешированием таких проблем нет. Но есть проблема с IE.
+1
letsgo letsgo 11 лет назад #
Вещь хорошая, но пришлось отключить. Во первых сразу с отключением сайт выровняло в ИЕ. Во вторых стали происходить нехорошие вещи с индексацией. Например добавил материал, закинул в твиттер, должен прийти робот, и собственно страница идет в выдачу. Однако тут робот приходит и не видит добавленного. И третье, в эффективности сайта Гугла, подвижек на снижение скорости загрузки сайта не заметил. Возможно если сделать вариант с кнопкой "очистка кеша" и с обнаружением, что корежит сайт в ИЕ, можно было бы испльзовать. Но за труд спасибо!
0
SJen SJen 11 лет назад #
Пока не могу разорваться, возможно в будущем сделаю что-то более универсальное для инстанта. А этот вариант выложил скорее для ознакомления - может кто "загорится" идеей и пойдет дальше.
0
Иван Шкута Иван Шкута 11 лет назад #
Может это как-то связанно с фильтрами для IE. Если страница была записана в кэш после посещения с оперы, то возможно эти фильтры были проигнорированы.
0
SJen SJen 11 лет назад #
А с каких пор сервер на php умеет определять тип браузера при формировании html страницы?))
0
Иван Шкута Иван Шкута 11 лет назад #
Кхе-кхе... а глобальная переменная $_SERVER['HTTP_USER_AGENT']??? Это ж старейший способ и некоторые его юзают вместо <!--[if lt IE 7]> до сих пор.
0
SJen SJen 11 лет назад #
ааа, вот о чем речь
ну если такое есть, тогда все возможно)

Значит у меня шаблон без таких интересностей, потому что никаких проблем с отображением в разных браузерах не наблюдал у себя
0
Иван Шкута Иван Шкута 11 лет назад #
+
Давно интересовал такой вопрос: при кэшировании страницы, рандомные ее части перестают меняться? Например случайное фото или случайное из каталога, которые изменяются при каждой перезагрузке страницы.
0
SJen SJen 11 лет назад #
можно встречный вопрос?) - при кэшировании любого модуля его содержимое меняется?

На самом деле ответ не так прост - вопрос в организации "рандома". Если "случайность" определяет php - тогда, конечно, меняться ничего не будет - потому что php тут не подрубается, а берется просто копия html страницы, сформированная ранее. Если "случайностью" управляет javascript (обычный скрипт или аякс) - то, конечно, будет меняться случайное фото и тд..
0
Иван Шкута Иван Шкута 11 лет назад #
Ну да. Логично. Мог бы и сам допереть )))
0
KS KS 11 лет назад #
По поводу отображения в ИЕ , как вариант -
был глюк с модулем который подключал js с внешнего файла , js маленький, поэтому я его в тело модуля засунул и отключил внешний. После этого , при включении кеша (смарти), у модуля в ИЕ сносило крышу ..
0
Иван Шкута Иван Шкута 11 лет назад #
Два вопроса по вычислению времени генерации. Вместо комментирования не лучше ли создать условие:
Код PHP:
////////////// Вычисляем и выводим время генерации, запросы к базе /////////////
	if ($inConf->debug) {
  		$time = $inCore->getGenTime();
      if ($fromcache){
    		echo $_LANG['DEBUG_TIME_GEN_PAGE'].' '.number_format($time, 4).' '.$_LANG['DEBUG_SEC'].'('.$inDB->q_count.' запросов)';
      }
      else {
    		echo $_LANG['DEBUG_TIME_GEN_PAGE'].' '.number_format($time, 4).' '.$_LANG['DEBUG_SEC'].'('.$inDB->q_count.' запросов)';
        $inCore->clearSessionTrash();
      }
	}
И почему $inCore->clearSessionTrash(); поставлен только в ложном if ($fromcache)?
0
Иван Шкута Иван Шкута 11 лет назад #
Извиняюсь. Вот так:
Код PHP:
////////////// Вычисляем и выводим время генерации, запросы к базе /////////////
   if ($inConf->debug) {
  		$time = $inCore->getGenTime();
      if ($fromcache){
    		echo 'Время генерации страницы: '.number_format($time, 4).' сек.(0 запросов)';
      }
      else {
    		echo $_LANG['DEBUG_TIME_GEN_PAGE'].' '.number_format($time, 4).' '.$_LANG['DEBUG_SEC'].'('.$inDB->q_count.' запросов)';
        $inCore->clearSessionTrash();
      }
   }
0
SJen SJen 11 лет назад #
насчет вывода времени - да как больше нравится. Можно и так, это же не глобально?
Код PHP:
$inCore->clearSessionTrash();
Насколько я понимаю, в этом нет смысла когда выводится закешированная версия.
0
Иван Шкута Иван Шкута 11 лет назад #
На счет if ($inConf->debug) понял почему нет. Поскольку после кэширования страницы конфиг-файл не подгружается, переменная $inConf->debug не определяется и равна null. Выход:

Строку (в оригинале 55 строка):
Код PHP:
    $inConf = cmsConfig::getInstance();
вставить после (в оригинале 44):
Код PHP:
    $inCore->startGenTimer();
и эту же строку удалить отсюда:
Код PHP:
    $inDB   = cmsDatabase::getInstance();
    $inPage = cmsPage::getInstance();
    $inConf = cmsConfig::getInstance();
    $inUser = cmsUser::getInstance();
Очистить кэш.
+1
SJen SJen 11 лет назад #
да можно конечно, ну если очень хочется подрубать дополнительный php код)
я же типа оптимизировал, минимизировал работу сервера - в чем фишка загружать сервер еще чем-то, добавляя ему работы?
0
Иван Шкута Иван Шкута 11 лет назад #
И то верно )
0
maia maia 11 лет назад #
Я сейчас озадачилась идеей вообще разным браузерам разный темплейт выдавать. У меня, правда, другая незадача - одну красивую фишку хром поганит, но может и для ИЕ можно отдавать без этой оптимизации, а остальным с ней?
0
SJen SJen 11 лет назад #
да все можно.. можно и разный контент, можно и для IE не кэшировать...
0
VLADIMIR VLADIMIR 11 лет назад #
Ох как летает. поставил + но у меня не захотело работать с папкой на уровень выше пришлось поставить голове сайта.
и вопрос а можно защитить эту папку в целях безопастности с помощью .htaccess
0
SJen SJen 11 лет назад #
положите в ту папку файл .htaccess c текстом
Код PHP:
deny from all
Так же как сделано в папке cache в корне инстанта.
0
Санечек Санечек 11 лет назад #
не пойму, что я не так сделал, сделал папку icash выше корня сайта, в папку cash положил папку Lait и файл lait.php, потом добавил в index.php коды и сайт отвалился. =(
0
Def Def 11 лет назад #
а в какой файл прописывать то что в инструкции?
0
bondar bondar 11 лет назад #
index.php в корне
+1
Apokalipsis Apokalipsis 11 лет назад #
А на 1.10 все так же само прописывать или что-то нужно менять?
0
Агроном Агроном 11 лет назад #
Под 1.10 кто нибудь правил?
0
Aleksandr Aleksandr 11 лет назад #
Поставил на 1.9, полет нормальный, только вот с RSS лентами беда какая-то, не экспортируются теперь (((
0
Aleksandr Aleksandr 11 лет назад #
гости не могут оставлять комментарии... глюки
0
SJen SJen 10 лет назад #
Да, помнится, на 1.9 для гостей я правил компонент "comments", там были проверки на идентификатор сессии, которая в случае вывода кэша у всех разная.
0
Cruzka Cruzka 10 лет назад #
Поставил на 1.10.1.
Круто, спасибо! то что надо
0
Cruzka Cruzka 10 лет назад #
Поставил на 1.10.1.
Круто, спасибо! то что надо
0
SJen SJen 10 лет назад #
комменты работают?
0
cvetkoff cvetkoff 10 лет назад #
нет
0
SJen SJen 10 лет назад #
и не должны
надо подправлять файлы компонента, там выводится проверяется номер сессии - который в данном случае не нужен.
0
Def Def 10 лет назад #
а что если в настройках мродулей дать возможность кэшировать не только по времени (5-10-15-н минут), но и по событию - апдейт таблицы, т.е появление новой записи и по нему делать перезапись кэша? ведь это действительно было бы удобно
0
SJen SJen 10 лет назад #
это непросто. Но даже если реализовать отлов события (мне приходит на ум только создание триггера в mysql), то править файлы придется... cms.php точно
0
Def Def 10 лет назад #
вот на однм из сайтов делали такую штуку после UPDATE таблицы

Код PHP:
  1. //вставка кэша
  2. $fdir = opendir( '../cache' );
  3. while ( $file = readdir( $fdir ) ) {
  4. @unlink( '../cache/cent-news-panel.cache' );
  5. }
  6. //вставка кэша
а на самом сайте вывод

Код PHP:
  1. $echo="";
  2. if (!cache_check('cent-news-panel', 1800))
  3. {cache_write('cent-news-panel', $echo); }
  4. else $echo = cache_read('cent-news-panel');
  5. echo $echo;
может нечто подобное можно и на инстанте?
0
Def Def 10 лет назад #
т.е он либо автоматически по времени обновляет кэш, либо же на странице добавления материала по событию обновления-добавления записи в БД
0
SJen SJen 10 лет назад #
это то понятно, но как мы узнаем что таблица апдейтится? - она может меняться в компоненте, в каком-то модуле, в других компонентах..

Если только хакнуть db.class.php - то есть перехватывать запросы на update таблиц и соответственно обновлять кэш (какой именно кэш и какого модуля - надо узнавать в какой-то спец таблице, которая будет хранить привязку модуля к таблице mysql). Можно, конечно, сделать
0
Def Def 10 лет назад #
за то ведь действительно удобно можно закэшировать очень многое и всегда будет новый кэш, т.е актуальный после добавления материалов:)

Еще от автора

Обновление компонента "Мне нравится"
Приветствую. Закончил версию с исправлением ошибок и багов, всем пользователям обновление выслано на электронку.
Обновление компонента  "Каталог дополнений в админку"
Приветствую. Обновление самого популярного аддона из официального каталога дополнений.
Обновленный парсер Яндекс.Карт
Приветствую Изменения довольно значительны, поэтому имеет смысл оформить их отдельным постом.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.