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

7041
День добрый.

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

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


Скрытый текст виден только зарегистрированным пользователям


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

Задача:

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

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

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

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

После включения таймера(таймер оставляем, чтобы в конце увидеть время генерации страницы)
Код PHP:
$inCore->startGenTimer();
Добавляем код для кэширования (UPDATE переименовал используемые переменные):
Код PHP:
  
$cl_user_id    = isset($_SESSION['user']['id']) ? $_SESSION['user']['id'] : 0;
  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 
	$cl_options = array( 
	 '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;
И после вывода шаблона
Код PHP:
	$inPage->showTemplate();
	}
Вставляем код
Код PHP:
$cl_cache->end();   
    } //закрыли кэширование
Ниже этого места находится такой код:
Код PHP:
////////////// Вычисляем и выводим время генерации, запросы к базе /////////////

	if ($inDB->q_count && $inConf->debug) {
		$time = $inCore->getGenTime();
		echo $_LANG['DEBUG_TIME_GEN_PAGE'].' '.number_format($time, 4).' '.$_LANG['DEBUG_SEC'];
		echo '
'.$_LANG['DEBUG_QUERY_DB'];
		echo ' '.$inDB->q_count.'
';
		echo $inDB->q_dump;
	}
//////////////////////// Очищаем временные переменные //////////////////////////
    $inCore->clearSessionTrash();
Вместо него вставляем:
Код PHP:
$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();
      }

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

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

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

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

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

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

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

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

Можно пойти дальше и главную страницу обновлять раз в 10 минут (чтобы поисковые роботы быстро съедали новые страницы), а остальные, например, раз в 10 часов.
Alex9 29 января 2013 в 20:22 0
А Где именно нужно "../ - или только слеш" ?
Alex9 29 января 2013 в 20:23 0
Где именно нужно Убрать "../ - или только слеш" :)
letsgo 25 апреля 2012 в 15:02 -1
Нда один момент появился)) рекламные баннеры то пропали. Как их вывести из кеширования? Получается для зарегенных есть реклама, для гостей нету.
letsgo 25 апреля 2012 в 15:04 0
Вопрос снимаю, все работает. Хотя сначала встала реклама.
SJen 25 апреля 2012 в 15:07 +2
пропали.. странно, а разве их нет в исходном коде?
или они как-то отдельно грузятся?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

У меня самого версия 1.9 и ничего из перечисленных багов я у себя не наблюдаю. Ни поехавшего дизайна, "ни админа без авторизации". Все работает уже более суток в таком формате.
krz 26 апреля 2012 в 01:28 0
ну вы то IE со всеми браузерами не ровняйте, это эксклюзив . У меня например скрипт времени на сайте работает во всех браузер, в IE нет, так что тут ничего удивительного, у него свои правила, своя жизнь)
SJen 26 апреля 2012 в 01:33 0
krz, то есть у вас шаблон сайта не кроссбраузерный?)) ну тут никакое кэширование не исправит тогда.. Я то имел ввиду, что всем браузерам отдается одинаковый html код - но если этот html кривой и неправильно открывается в каком-то браузере, то он и будет открываться неправильно - кэш это или нет, не важно.
krz 26 апреля 2012 в 01:49 0
шаблон везде отображает одинаково, и в IE тоже, просто есть мелкие заморочки, а после добавки кода в индекс во всех нормально отображает, а в ие сразу слетает, код убираю - и все становится нормально, с чем связано тоже не пойму, поскольку там как и говорили ничего подобного к внешнему виду нет)) Разберусь думаю
SJen 26 апреля 2012 в 01:37 0
krz, проверил в IE свои таймеры по времени - все прекрасно работает)
надо ваши скрипты смотреть - вполне можно написать так, что будет работать везде одинаково
Дмитрий 9 мая 2012 в 02:42 0
Ваш сайт в IE8 тоже расплылся. Если надо, могу сделать скрин. Так что пока повременю с хаком )
letsgo 9 мая 2012 в 06:08 0
да печенюка в ИЕ искорежена
SJen 9 мая 2012 в 10:42 0
посмотрел, это никак не связано с кешем - ослик плохо переваривает некоторые вещи, но и с ним я уже договорился. Не ломает сайт.

Сейчас и в IE нормально смотрится (смотрел в IE8).
Дмитрий 9 мая 2012 в 23:54 0
Да, сейчас ок.
GarikKR 26 апреля 2012 в 03:24 0
Перекачал архив , все работает как положено.В IE карежет до не узнаваемости,в чем причина не пойму
ivanish 8 мая 2012 в 21:09 0
Скрипты JS - с ними что-то не так
letsgo 26 апреля 2012 в 03:53 +2
Да в ИЕ корежит сайт очень сильно.
SJen 26 апреля 2012 в 10:46 0
а если по коду посмотреть, из-за чего в IE ломается дизайн? - смотрю свой шаблон, открывается одинаково во всех браузерах
Дмитрий 26 апреля 2012 в 10:53 0
Привет всем. У меня тож не отображаются метки в инстант мапс. вышеизложенные варианты решения проблемы пробовал=(
И после ввода логин пароля открывается пустая страница www.сайт/login
SJen 26 апреля 2012 в 12:37 +1
добавил пятый пункт (как убрать register_globals).
Описание зачем это надо сделать
KS 26 апреля 2012 в 12:45 0
В Мапсе при входе в любую рубрику идет обработка по городу и другим фильтрам. Его нужно как то отдельно кешировать.
Там весь вывод списка объектов строится на этом.
Например если закешировать модуль Новости в Мапсе, то новости увидите только того города который в кеше!
Зайдет человек с другого города - увидит тоже самое ..
В кеше будет записана инфо только по одному параметру.
Т.е. Меняя параметры, например на карте где динамично меняются маркеры , они уже будут глючить.

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

Мало кэшировать только шаблоны, это не решает все проблемы с большой нагрузкой..
• Mike • 26 апреля 2012 в 16:46 0
SJen 26 апреля 2012 в 16:48 0
К смарти претензий нет) Кэшировать функции движка надо, которые вызываются ДО смарти
KS 27 апреля 2012 в 03:34 0
Это то что надо ! Можно с мапса самолет сделать ! Не говоря про остальное ..
Скоро наверно скачаю, займусь модернизацией ,)
Это самая нужная полезность ! Спасибо!
KS 26 апреля 2012 в 16:24 0
уже ) .. Не могу обновить мапс дальше 1.8
точней могу, но это много времени нужно ..
ivanish 8 мая 2012 в 21:10 0
А расскажите всем - как?
GarikKR 26 апреля 2012 в 17:39 0
Проблемы с IE так и остались,по коду все тоже самое ,а шаблон ломается((
SJen 26 апреля 2012 в 17:57 0
закиньте в личку ссылку на сайт.
Я смотрел один сайт, у которого в IE едет шаблон - но там были косяки в верстке.
Если код такой же, то нет причин того, чтобы в каком-то браузере открывался сайт по-другому.. надо смотреть конкретный пример, тогда смогу ответить какая причина.
Зекабрист 26 апреля 2012 в 19:12 0
instant 1.9 все сделал как написано .
Но теперь при авторизации попадаю на белую станицу тоже самое при выходе. В файл htaccess в корне сайта все добавил
SJen 26 апреля 2012 в 19:24 0
отключайте кэш, не могу пока ответить почему так
на нескольких сайтах такое видел
На других же с кешированием таких проблем нет. Но есть проблема с IE.
letsgo 28 апреля 2012 в 16:22 +1
Вещь хорошая, но пришлось отключить. Во первых сразу с отключением сайт выровняло в ИЕ. Во вторых стали происходить нехорошие вещи с индексацией. Например добавил материал, закинул в твиттер, должен прийти робот, и собственно страница идет в выдачу. Однако тут робот приходит и не видит добавленного. И третье, в эффективности сайта Гугла, подвижек на снижение скорости загрузки сайта не заметил. Возможно если сделать вариант с кнопкой "очистка кеша" и с обнаружением, что корежит сайт в ИЕ, можно было бы испльзовать. Но за труд спасибо!
SJen 28 апреля 2012 в 17:17 0
Пока не могу разорваться, возможно в будущем сделаю что-то более универсальное для инстанта. А этот вариант выложил скорее для ознакомления - может кто "загорится" идеей и пойдет дальше.
Иван Шкута 28 апреля 2012 в 17:26 0
Может это как-то связанно с фильтрами для IE. Если страница была записана в кэш после посещения с оперы, то возможно эти фильтры были проигнорированы.
SJen 28 апреля 2012 в 17:49 0
А с каких пор сервер на php умеет определять тип браузера при формировании html страницы?))
Иван Шкута 29 апреля 2012 в 20:42 0
Кхе-кхе... а глобальная переменная $_SERVER['HTTP_USER_AGENT']??? Это ж старейший способ и некоторые его юзают вместо <!--[if lt IE 7]> до сих пор.
SJen 29 апреля 2012 в 20:59 0
ааа, вот о чем речь
ну если такое есть, тогда все возможно)

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

На самом деле ответ не так прост - вопрос в организации "рандома". Если "случайность" определяет php - тогда, конечно, меняться ничего не будет - потому что php тут не подрубается, а берется просто копия html страницы, сформированная ранее. Если "случайностью" управляет javascript (обычный скрипт или аякс) - то, конечно, будет меняться случайное фото и тд..
Иван Шкута 28 апреля 2012 в 17:27 0
Ну да. Логично. Мог бы и сам допереть )))
KS 29 апреля 2012 в 05:28 0
По поводу отображения в ИЕ , как вариант -
был глюк с модулем который подключал js с внешнего файла , js маленький, поэтому я его в тело модуля засунул и отключил внешний. После этого , при включении кеша (смарти), у модуля в ИЕ сносило крышу ..
Иван Шкута 29 апреля 2012 в 23:13 0
Два вопроса по вычислению времени генерации. Вместо комментирования не лучше ли создать условие:
Код 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)?
Иван Шкута 29 апреля 2012 в 23:19 0
Извиняюсь. Вот так:
Код 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();
      }
   }
SJen 29 апреля 2012 в 23:26 0
насчет вывода времени - да как больше нравится. Можно и так, это же не глобально?
Код PHP:
$inCore->clearSessionTrash();
Насколько я понимаю, в этом нет смысла когда выводится закешированная версия.
Иван Шкута 30 апреля 2012 в 00:45 0
На счет 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();
Очистить кэш.
SJen 30 апреля 2012 в 01:01 +1
да можно конечно, ну если очень хочется подрубать дополнительный php код)
я же типа оптимизировал, минимизировал работу сервера - в чем фишка загружать сервер еще чем-то, добавляя ему работы?
Иван Шкута 30 апреля 2012 в 02:52 0
И то верно )
maia 30 апреля 2012 в 06:58 0
Я сейчас озадачилась идеей вообще разным браузерам разный темплейт выдавать. У меня, правда, другая незадача - одну красивую фишку хром поганит, но может и для ИЕ можно отдавать без этой оптимизации, а остальным с ней?
SJen 30 апреля 2012 в 10:18 0
да все можно.. можно и разный контент, можно и для IE не кэшировать...
VLADIMIR 8 мая 2012 в 13:54 0
Ох как летает. поставил + но у меня не захотело работать с папкой на уровень выше пришлось поставить голове сайта.
и вопрос а можно защитить эту папку в целях безопастности с помощью .htaccess
SJen 8 мая 2012 в 14:13 0
положите в ту папку файл .htaccess c текстом
Код PHP:
deny from all
Так же как сделано в папке cache в корне инстанта.
Санечек 15 августа 2012 в 11:51 0
не пойму, что я не так сделал, сделал папку icash выше корня сайта, в папку cash положил папку Lait и файл lait.php, потом добавил в index.php коды и сайт отвалился. =(
Def 16 августа 2012 в 11:55 0
а в какой файл прописывать то что в инструкции?
krz 16 августа 2012 в 12:31 0
index.php в корне
Apokalipsis 15 ноября 2012 в 11:15 +1
А на 1.10 все так же само прописывать или что-то нужно менять?
Агроном 27 ноября 2012 в 18:30 0
Под 1.10 кто нибудь правил?
Aleksandr 13 декабря 2012 в 18:21 0
Поставил на 1.9, полет нормальный, только вот с RSS лентами беда какая-то, не экспортируются теперь (((
Aleksandr 31 декабря 2012 в 18:52 0
гости не могут оставлять комментарии... глюки
SJen 10 октября 2013 в 04:25 0
Да, помнится, на 1.9 для гостей я правил компонент "comments", там были проверки на идентификатор сессии, которая в случае вывода кэша у всех разная.
Cruzka 10 октября 2013 в 02:13 0
Поставил на 1.10.1.
Круто, спасибо! то что надо
Cruzka 10 октября 2013 в 02:13 0
Поставил на 1.10.1.
Круто, спасибо! то что надо
SJen 10 октября 2013 в 04:25 0
комменты работают?
cvetkoff 7 ноября 2013 в 08:24 0
нет
SJen 7 ноября 2013 в 08:48 0
и не должны
надо подправлять файлы компонента, там выводится проверяется номер сессии - который в данном случае не нужен.
Def 7 ноября 2013 в 01:17 0
а что если в настройках мродулей дать возможность кэшировать не только по времени (5-10-15-н минут), но и по событию - апдейт таблицы, т.е появление новой записи и по нему делать перезапись кэша? ведь это действительно было бы удобно
SJen 7 ноября 2013 в 05:38 0
это непросто. Но даже если реализовать отлов события (мне приходит на ум только создание триггера в mysql), то править файлы придется... cms.php точно
Def 7 ноября 2013 в 09:02 0
вот на однм из сайтов делали такую штуку после UPDATE таблицы

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

Код 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;
может нечто подобное можно и на инстанте?
Def 7 ноября 2013 в 09:03 0
т.е он либо автоматически по времени обновляет кэш, либо же на странице добавления материала по событию обновления-добавления записи в БД
SJen 7 ноября 2013 в 09:18 0
это то понятно, но как мы узнаем что таблица апдейтится? - она может меняться в компоненте, в каком-то модуле, в других компонентах..

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