[REVO] Cache MODX Revolution -> быстрее только на html. Часть 2
Продолжаю тему кэширования предыдущего поста. Так как там мы только набросали наброски, попробуем привести в божеский вид.
Если мы откроем файл кэша, то можем посмотреть, сколько всего у нас там есть, всё это нужно, но не для полной закэшированной страницы.
В среднем, при сохранении в кэш страницы нашим плагином, разница в размере файла будет где то в 10 раз, так как мы сохраняем нам только нужный результат.
Для примера, я пытался не вклиниваться в index.php файл и на событие OnHandleRequest вывести свой кэш, как видите — результат не стоит этого.
Я установил 2 расширения getResources и getPage (берём популярные, можно для навигации и pageNav).
К стате по поводу addExtensionPackage, консультировался с Шоном.
Лирику отставим, перейдём к делу,
После установки пакета, вставьте инклуд в файл index.php, примерно 40 строка после
вставить:
перед инклудом классов MODX
При создании ресурса, во вкладке "Настройки", у вас появиться чекбокс Включить superCache.
Настройки по умолчанию находятся в вкладке "Параметры" плагина superCache
При очистки кэша и создания/сохранения ресурса кэш полностью убиваеться. (пока по принципу MODX).
Кэширование проверял так-же и с getPage, но параметр sc_out должен быть обязательно быть Treated not cached tags, так как в getPage идут не кэшированные вызовы.
Пока всё, вроде комментарии в коде проставленны, если есть вопросы задавайте.
В следующем топике разберём пример создания новостной страницы с выводом снипета последних новостей, и научимся управлять кэшем, создадим алгоритм работы и немного усовершенствуем наш плагин, чтобы не очищать весь кэш сайта.
Код на гитхубе
Скачать плагин можно по этой ссылки
Если мы откроем файл кэша, то можем посмотреть, сколько всего у нас там есть, всё это нужно, но не для полной закэшированной страницы.
В среднем, при сохранении в кэш страницы нашим плагином, разница в размере файла будет где то в 10 раз, так как мы сохраняем нам только нужный результат.
Для примера, я пытался не вклиниваться в index.php файл и на событие OnHandleRequest вывести свой кэш, как видите — результат не стоит этого.
Я установил 2 расширения getResources и getPage (берём популярные, можно для навигации и pageNav).
Результат вывода ресурса с файлового кэша.
0.0366 s модекса кэш FileCache.Как я уже упомянул в предыдущем топике, что инициализация забирает очень много времяни (очень — понятие относительное), но вот давайте представим когда у вас много или очень много разных пакетов и любителей использовать addExtensionPackage(). т.е. нужно или не нужно, но мы грузим все свои классы (так как разработчику меньше париться и везде доступно :), т.е. каждый метод имеет своё место.
0.030276 s через плагин SuperCache на OnHandleRequest FileCache
0.000918 s. SuperCache FileCache
К стате по поводу addExtensionPackage, консультировался с Шоном.
Лирику отставим, перейдём к делу,
ещё один тест с кэшем APC:
0.0339 s модекса кэш APCCacheНу и теперь про сам плагин superCache. Почему superCache? Моё мнение, что быстрее уже нельзя просто, единственное можно инклудить ещё раньше, не подгружая конфиг и кэш настроек модекса, а просто в ручную вбить нужные параметры, тогда скорость с APC кэшем будет в приделах 0.0004 — 0.0006 s
0.00073 s SuperCache APCCache
Про настройки плагина
На данный момент плагин работает с файловым и APC кэшем.После установки пакета, вставьте инклуд в файл index.php, примерно 40 строка после
if (!defined('MODX_CORE_PATH')) define('MODX_CORE_PATH', dirname(__FILE__) . '/core/');
вставить:
include_once MODX_CORE_PATH.'components/supercache/supercache_read_cache.php';
перед инклудом классов MODX
При создании ресурса, во вкладке "Настройки", у вас появиться чекбокс Включить superCache.
Настройки по умолчанию находятся в вкладке "Параметры" плагина superCache
- cs_cache_checkbox_defaulr — ставить чекбокс superCache активный при создании нового ресурса
- sc_expires — время жизни кэша (в секундах), если нуль (0), то кэш будет удалён при обнавлении ресурса или очистки кэша
- sc_out — два параметра выбора:
- Treated not cached tags — Выводиться полностью закэшированная страница (рекомендуеться)
- Untreated not cached tags — Не кэшированные теги выводяться не обработанные (для опытных пользователей)
При очистки кэша и создания/сохранения ресурса кэш полностью убиваеться. (пока по принципу MODX).
Кэширование проверял так-же и с getPage, но параметр sc_out должен быть обязательно быть Treated not cached tags, так как в getPage идут не кэшированные вызовы.
Пока всё, вроде комментарии в коде проставленны, если есть вопросы задавайте.
В следующем топике разберём пример создания новостной страницы с выводом снипета последних новостей, и научимся управлять кэшем, создадим алгоритм работы и немного усовершенствуем наш плагин, чтобы не очищать весь кэш сайта.
Код на гитхубе
Скачать плагин можно по этой ссылки
51 комментарий
у меня не появляется. ни при создании нового, ни в уже существующем ресурсе.
пакет ставится в — /components/supercache/supercache/supercache_read_cache.php
пути менял, переставлял и так и так — не выходит каменный цветок
должно быть так
можно структуру посмотреть на гитхубе
Сейчас пересобиру пакет
я modx.chek.js не переносил
Parse error: syntax error, unexpected T_FUNCTION in /home/f/fr30470/public_html/core/components/supercache/supercache_read_cache.php on line 33
выдает
Notice: Undefined index: q in X:\Ampps\www\modx\core\components\supercache\supercache_read_cache.php on line 32
Я постараюсь исправить сегодня и выложить решение.
memory: 4.7374 Mb // time: 0.04 s
я только одного не пойму, вот это //APCCache: 0.000495 s. :: Расход памяти: 51.18 kb// КАК???)
Если вы уверены. что у вас все сниппеты закэшированные (в принципи вы их увидете),
выбирете в настройках плагина sc_out Untreated not cached tags, тогда у вас тег времяни [^t^] будут заменён на время фактическое.
Второй способ, оставить как есть и в файле supercache_read_cache.php
где идёт вывод контента 52 строка для APC
github.com/artdevue/superCache/blob/master/core/components/supercache/supercache_read_cache.php#L52
просто замените строчку
на
таким способом мы не будум парсить тег, а в футер выведем время и память (это как для теста, чтобы увидеть)
Фактически если вам нужно отобразить на сайте этот тег. то способов много есть.
Если как для информации, я выше описал.
Спасибо за тест vgrish
в случае когда кеш файловый (xPDOFileCache) он живет sc_expires, а в случае cache.xPDOAPCCache тут уже вмешиваются настройки APC..? на шаред хосте я могу их как то отрегулировать? ато кеш обнуляется каждые 5минут…
Возможен момент, что на шадер хосте за 5 минут просто файл самоуничтожаеться (зависит от посещения всех сайтов, к которым выделена память). А вот с файловым кэшем такого не происходит.
еще вопрос, может конечно глупый, не судите строго, а ведь можно для динамики аякс использовать? ну то есть загнать в суперкеш всю страницу, а там где динамический контент подгружать аяксом все по мере необходимости? или я ерунду спросил… спасибо!
Второй вариант, к примеру jQuery плагин Infinite Scroll (возможно я ошибаюсь), просто вырезает необходимые теги при аяксе и вставляет в страницу существующую, в этом случае, можно и использовать superCache.
Но, ещё раз повтарюсь, более логично аяксом управлять через свой плагин/сниппет, и там уже на основе своих данных кэшировать самому.
спасибо!
хотя все работало еще вчера, что то ему перестало нравиться, я так понимаю что то с путем к кешу?
Если кто раньше меня это сделает, спасибо большое, так как с времянем не сильно роскошно.
UPDATE modx_site_content SET properties = '{«supercache»:{«supercache»:»1»}}'
p.s. только кавычки по другому написать надо, а тут они исправляются
2) у меня нет таких параметров в настройке, раздел supercache. это нормально? переустановить?
3) очень часто слетает галка суперкеша при сохранении ресурса.
4) ждем продолжения и обновления суперкеша. спасибо автору за это! это очешуительно!
Попробовал я Ваше решение в связке с refreshcache.
У меня мультиязычный сайт, на русском и на украинском.
Я проставил галочки в ресурсах, которые были созданы раньше, до данного решения.
Когда ставил галочки в настройках документа и жал кнопку «сохранить» — они исчезали. Ну, то мелочи, после очистки кэша галочки стояли.
Но странно, что некоторые ресурсы, остались со «старым кэшем». То есть, все страницы летают, а некоторые (на которых точно стоит галочка), с тем системным кэшем, который был раньше. Причём, очень странно. Ресурсы ведь те же.
Например: у меня есть «Главная» и «Головна», как полагается.
Стоит BabelLinks. Думаю, сейчас побегаю между ними. «Главная» с суперкэшем, а «Головна» — нет. Проверял галочку в настройках — стоит. И таких документов у меня порядка 10 где-то.
Ещё кое-что из моих наблюдений.
Использовал по ходу разработки сайта системные тэги [^t^] [^s^].
Сейчас у меня они остались. Выше я упоминал «старый кэш» и, может, Вы и кто-то не понял.
Таким образом я определил, какие документы с суперкэшем, а какие — нет.
Захожу я на страницу «Главная», которая в суперкэше и вижу:
Render time: 1.4711 s
Источник содержимого: database
А потом сразу жму на переключатель на укр, перехожу на «Головна»:
Render time: 0.2379 s
Источник содержимого: cache
И те файлы, которые в суперкэше показывают мне, что взяты из базы и что их время — время первого вхождения. Но эти страницы летают, визуально видно, на них Ваш метод сработал, но у меня около 10, страниц, как я и говорил, с похожей ситуацией, как «Головна». Они не занеслись в суперкэш, хотя на каждом из них стоит галочка.
Я поставил сниппет Refreshcache и это очень удобно. Что-то изменил в шаблоне, сбросил кэш со всего сайта. Потом быстренько просканировал сниппетом refreshcache и всё в кэше:) Там полоса загрузки идёт, на сканирование всех документов (чтобы все они упали в кеш, а их у меня 120 где-то) уходит 2:45. Всё же лучше, чем заставлять посетителя сайта ждать! А на сайте у меня куча вызовов getResources.
Идея сниппета refreshcache очень классная, но долго сбрасывает документы в кэш. 120 документов — 2 минуты 45 секунд, а если 5000 — ?
Вот такие вот дела! Извините, пожалуйста, если я занудно расписал свои наблюдения.
Надеюсь, я сумел внести свой вклад и помочь хоть чем-то. Хотя бы, пока, своими наблюдениями!
Спасибо за внимание!
MODx 2.2.7-pl (traditional)
php 5.3.13
локальный сервер (wamp)
Плагин в меню появляется, системные события и настройки тоже появляются.
Кеш обновлял и core/cache чистил.
В файл index.php строку include_once MODX_CORE_PATH.'components/supercache/supercache_read_cache.php'; добавил.
При установке выдались ошибки, попробовал переустановить.
Вот лог при переустановке:
Выводится предупреждение:
При установке компонента на хостинге оказывается невозможным удалить ни один из файлов компонента — permission denied. Также, невозможно очистить кеш сайта из FTP клиента — та же проблема — permission denied.
Еще при включении компонента вылетает 500 ошибка во фронтенде. В логах сервера ошибки PHP Parse error: syntax error, unexpected T_FUNCTION in /core/components/supercache/supercache_read_cache.php on line 38
и
File does not exist: /srv/tvn/usr0/site.ru/html/postelnoe-bele (вот это странно, по идее путь должен быть site.ru/postelnoe-bele или /srv/tvn/usr0/site.ru/html/core/cache/postelnoe-bele может я неправильно где-то конфиг настроил?)
При удалении компонента сайт начинает работать.
Прошу прощения, возможно проблема с невозможностью удалить файлы связана не с модулем, а с хостингом и самим modx. Т.к. невозможно удалить только те файлы и папки, которые создаются из modx.Когда скопировал файлы на хостинг — все удалялось кроме кеша. Потом удалил и заново установил компонент (т.е. он уже на хостинге средствами modx распаковался) и файлы компонента перестали удаляться. Так что проблема видимо в modx((
Вопрос только по 500 ошибке во фронтенде и ошибкам с php.
Вот другие параметры хостера (может что-то еще подскажете):
modx 2.2.7
Apache/2.0.63 (FreeBSD)
MySQL client version: 5.1.24-rc
MODX Revolution 2.2.7-pl (traditional)
PHP Version 5.2.17
* был затык — разобрался
хостинг от Sweb.ru не сразу апдейтиться на (php 5.3)
** правда на вкладке «параметры» нет опций
В любом случае, спасибо, на тесте прирост скорости огромный получался.
Не появляется чекбокс в ресурсе. Ошибок никаких не выдает.
подскажите
это уже реализовано?