[REVO] Cache MODX Revolution -> быстрее только на html. Часть 2

superCacheПродолжаю тему кэширования предыдущего поста. Так как там мы только набросали наброски, попробуем привести в божеский вид.
Если мы откроем файл кэша, то можем посмотреть, сколько всего у нас там есть, всё это нужно, но не для полной закэшированной страницы.
В среднем, при сохранении в кэш страницы нашим плагином, разница в размере файла будет где то в 10 раз, так как мы сохраняем нам только нужный результат.
Для примера, я пытался не вклиниваться в index.php файл и на событие OnHandleRequest вывести свой кэш, как видите — результат не стоит этого.
Я установил 2 расширения getResources и getPage (берём популярные, можно для навигации и pageNav).
Результат вывода ресурса с файлового кэша.
0.0366 s модекса кэш FileCache.
0.030276 s через плагин SuperCache на OnHandleRequest FileCache
0.000918 s. SuperCache FileCache
Как я уже упомянул в предыдущем топике, что инициализация забирает очень много времяни (очень — понятие относительное), но вот давайте представим когда у вас много или очень много разных пакетов и любителей использовать addExtensionPackage(). т.е. нужно или не нужно, но мы грузим все свои классы (так как разработчику меньше париться и везде доступно :), т.е. каждый метод имеет своё место.
К стате по поводу addExtensionPackage, консультировался с Шоном.
Лирику отставим, перейдём к делу,
ещё один тест с кэшем APC:
0.0339 s модекса кэш APCCache
0.00073 s SuperCache APCCache
Ну и теперь про сам плагин superCache. Почему superCache? Моё мнение, что быстрее уже нельзя просто, единственное можно инклудить ещё раньше, не подгружая конфиг и кэш настроек модекса, а просто в ручную вбить нужные параметры, тогда скорость с APC кэшем будет в приделах 0.0004 — 0.0006 s
Про настройки плагина
На данный момент плагин работает с файловым и 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 комментарий

avatar
2.2.6
у меня не появляется. ни при создании нового, ни в уже существующем ресурсе.
вставить:
include_once MODX_CORE_PATH.'components/supercache/supercache_read_cache.php';
пакет ставится в — /components/supercache/supercache/supercache_read_cache.php
пути менял, переставлял и так и так — не выходит каменный цветок
avatar
Пакет собирал Пакманом, и не правильно файл лёг
должно быть так

можно структуру посмотреть на гитхубе
Сейчас пересобиру пакет
avatar
ага, так работает. появилась галка
я modx.chek.js не переносил
Комментарий отредактирован 2013-03-30 14:47:11 пользователем Kirman
avatar
галка появилась, но страницы не грузятся, только ошибку выдает
Parse error: syntax error, unexpected T_FUNCTION in /home/f/fr30470/public_html/core/components/supercache/supercache_read_cache.php on line 33
Комментарий отредактирован 2013-03-30 18:47:42 пользователем vgrish
avatar
какая версия php?
avatar
5.2.17
avatar
Эта версия не потдерживает анонимные функции. нужно подумать переписывать функцию или вам обновиться на 5.3
avatar
локально хотел попробовать там php 5.4.11
выдает
Notice: Undefined index: q in X:\Ampps\www\modx\core\components\supercache\supercache_read_cache.php on line 32
Комментарий отредактирован 2013-03-30 19:10:53 пользователем vgrish
avatar
спасибо за тестирование. эта ошибка возникает при home page, так как урла нету.
Я постараюсь исправить сегодня и выложить решение.
avatar
да незачто, я постараюсь сейчас еще на 5.3 попробовать и отпишусь
avatar
на 5.3 все встало без ошибок.
avatar
выставил у себя cache.xPDOAPCCache, поставил bootstrap и wayfinder — итого имею
memory: 4.7374 Mb // time: 0.04 s

я только одного не пойму, вот это //APCCache: 0.000495 s. :: Расход памяти: 51.18 kb// КАК???)
avatar
memory: 4.7374 Mb // time: 0.04 s
Это вы выводите закэшированные модекса данные.

Если вы уверены. что у вас все сниппеты закэшированные (в принципи вы их увидете),
выбирете в настройках плагина 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
просто замените строчку
echo str_replace('[^t^]', 'APCCache: '.round($time,6).' s. :: Memory: '.convert(memory_get_usage() - $start_memory_usage), $value['output']);
на
echo $value['output'].'<div>APCCache: '.round($time,6).' s. :: Memory: '.convert(memory_get_usage() - $start_memory_usage).'</div>';
таким способом мы не будум парсить тег, а в футер выведем время и память (это как для теста, чтобы увидеть)
Фактически если вам нужно отобразить на сайте этот тег. то способов много есть.
Если как для информации, я выше описал.
Комментарий отредактирован 2013-03-30 21:08:51 пользователем artdevue
avatar
Перелил пакет м исправлениями. Теперь главная страница сайта должна быть без ошибок при кэшировании.
Спасибо за тест vgrish
avatar
поставил обновленный пакет, теперь и на локалке работает! спасибо!
avatar
Обновил пакет, добавил мелочь на событие чекбокса. Т.е, если у нас кнопка «сохранить» не активная, то при вборе чекбокса она активируеться.
avatar
хотел об этом Вам написать, но не успел, исправили. Тогда ещё небольшой косячок — если нажать — Включить superCache и сохранить документ, чекбокс опять становится неактивным (без галки). Но если ещё раз зайти в ресурс или обновить — галка есть
avatar
второй день supercache обкатываю-он действительно СУПЕР!)
в случае когда кеш файловый (xPDOFileCache) он живет sc_expires, а в случае cache.xPDOAPCCache тут уже вмешиваются настройки APC..? на шаред хосте я могу их как то отрегулировать? ато кеш обнуляется каждые 5минут…
Комментарий отредактирован 2013-04-01 18:17:16 пользователем vgrish
avatar
если APCCache и время жизни кэша в настройке плагина sc_expires стоит 0, то кэш живёт до того момента пока не обновите кэш или создадите/редактируете новый ресурс, но, с APC есть маленький нюанс. Дело в том, что мы знаем, что APC кэш храниться в памяти а память не резиновая, то по мере записи новых файлов — старый отодвигаются назад.
Возможен момент, что на шадер хосте за 5 минут просто файл самоуничтожаеться (зависит от посещения всех сайтов, к которым выделена память). А вот с файловым кэшем такого не происходит.
avatar
спасибо за разъяснения! значит юзаем файловый)))
еще вопрос, может конечно глупый, не судите строго, а ведь можно для динамики аякс использовать? ну то есть загнать в суперкеш всю страницу, а там где динамический контент подгружать аяксом все по мере необходимости? или я ерунду спросил… спасибо!
avatar
Для аякса используют не весь код страницы, так-что смысла нету использовать код всей страницы. Обычно создают плагин и на него вешают обработку запроса аякс и отдачу результата. Здесь-же можно и сохранять в свой кэш (даже на основе этого плагина).
Второй вариант, к примеру jQuery плагин Infinite Scroll (возможно я ошибаюсь), просто вырезает необходимые теги при аяксе и вставляет в страницу существующую, в этом случае, можно и использовать superCache.
Но, ещё раз повтарюсь, более логично аяксом управлять через свой плагин/сниппет, и там уже на основе своих данных кэшировать самому.
avatar
а можно где то посмотреть пример исполнения такого плагина? сам код…
спасибо!
avatar
/*
	--------------------------------
	Infinite Scroll
	--------------------------------
	+ https://github.com/paulirish/infinitescroll
	+ version 2.0b2.110713
	+ Copyright 2011 Paul Irish & Luke Shumard
	+ Licensed under the MIT license
	
	+ Documentation: http://infinite-scroll.com/
	
*/
avatar
на одном из пробных сайтов вот такая бяка стала вылезать
Parse error: syntax error, unexpected T_FUNCTION in /home/f/fr30470/public_html/core/components/supercache/supercache_read_cache.php on line 34
хотя все работало еще вчера, что то ему перестало нравиться, я так понимаю что то с путем к кешу?
Комментарий отредактирован 2013-04-02 08:27:54 пользователем vgrish
avatar
пардон. ложная тревога опять php 5,2
avatar
При очистки кэша и создания/сохранения ресурса кэш полностью убиваеться. (пока по принципу MODX).
т.е. если один ресурс обновлю то убивается весь супер кеш? я правильно понимаю? нельзя выборочно убивать? один ресурс обновил — только его кеш убил?
avatar
можно конечно. Я же написал, что в следующем топике разберём этот вопрос. Просто нужна структура управления кэшем, так как есть зависимости. В принципе по этой-же и причине модекс поступает так-же по дефолу.
avatar
Работает, все супер быстро)) огромное спасибо автору. Но чтоб активировать данный плагин приходиться пересохранять сами ресурсы, когда их очень много это очень скучно… не подскажите как пересохранить все ресурсы по быстрому? и чтоб данный плагин работал.
avatar
нужно написать сниппет, в который вы забъёте id родителей или ресурсов нужных и он обойдёт все ресурсы и запишет в поле пропортиес данные активного чекбокса.
Если кто раньше меня это сделает, спасибо большое, так как с времянем не сильно роскошно.
avatar
Не стал заморачиваться со сниппетом, сделал одним sql запросом для всех ресурсов:
UPDATE modx_site_content SET properties = '{«supercache»:{«supercache»:»1»}}'

p.s. только кавычки по другому написать надо, а тут они исправляются
Комментарий отредактирован 2013-04-11 14:52:50 пользователем ivan345
avatar
А как с новым модэстом, кто-нибудь пробовал?
avatar
Я пробовал, все отлично работает
avatar
В 2.2.7 при использовании Ajax Manager не появляется галочка при переходе со страницы на страницу. Но при обновлении по F5 все ок.
Комментарий отредактирован 2013-04-12 11:10:01 пользователем iseredov
avatar
1) cs_cache_checkbox_defaulr, sc_expires, sc_out — специально первый параметр написано так странно?

2) у меня нет таких параметров в настройке, раздел supercache. это нормально? переустановить?

3) очень часто слетает галка суперкеша при сохранении ресурса.

4) ждем продолжения и обновления суперкеша. спасибо автору за это! это очешуительно!
avatar
Спасибо огромное, Валентин!
Попробовал я Ваше решение в связке с 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 — ?

Вот такие вот дела! Извините, пожалуйста, если я занудно расписал свои наблюдения.
Надеюсь, я сумел внести свой вклад и помочь хоть чем-то. Хотя бы, пока, своими наблюдениями!

Спасибо за внимание!
  • Dozz
  • 0
avatar
Ещё перестали работать LikeDislike, ModxTalks и HitsPage
  • Dozz
  • 0
avatar
ответ от 30 марта посмотри выше...Your text to link...
avatar
У меня не появился чекбокс ни при создании документа ни в текущих((

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'; добавил.

При установке выдались ошибки, попробовал переустановить.

Вот лог при переустановке:
Пробуем установить пакет с подписью: supercache-1.0.0-pl
Пакет найден... сейчас идёт подготовка к его установке.
Загрузка рабочего пространства пакета...
Рабочее пространство загружено, сейчас устанавливаем пакет...
Error 42S22 executing statement: Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'modPluginEvent.name' in 'where clause' ) 
Error 23000 executing statement: INSERT INTO `modx_site_plugin_events` (`pluginid`, `event`, `priority`, `propertyset`) VALUES (11, '', 0, 0) Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '11-' for key 'PRIMARY' ) 
Error saving vehicle object of class modPluginEvent; criteria: Array ( [name] => ) 
Error 42S22 executing statement: Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'modPluginEvent.name' in 'where clause' ) 
Error 23000 executing statement: INSERT INTO `modx_site_plugin_events` (`pluginid`, `event`, `priority`, `propertyset`) VALUES (11, '', 0, 0) Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '11-' for key 'PRIMARY' ) 
Error saving vehicle object of class modPluginEvent; criteria: Array ( [name] => ) 
Error 42S22 executing statement: Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'modPluginEvent.name' in 'where clause' ) 
Error 23000 executing statement: INSERT INTO `modx_site_plugin_events` (`pluginid`, `event`, `priority`, `propertyset`) VALUES (11, '', 0, 0) Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '11-' for key 'PRIMARY' ) 
Error saving vehicle object of class modPluginEvent; criteria: Array ( [name] => ) 
Could not install related objects with locally owned keys for vehicle object of class modPlugin; criteria: Array ( [name] => SuperCache ) 
Running PHP Resolver.
Assigning Events to Plugin SuperCache
Error 23000 executing statement: INSERT INTO `modx_site_plugin_events` (`pluginid`, `event`, `priority`, `propertyset`) VALUES (11, 'OnLoadWebDocument', 0, 0) Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '11-OnLoadWebDocument' for key 'PRIMARY' ) 
Error 23000 executing statement: INSERT INTO `modx_site_plugin_events` (`pluginid`, `event`, `priority`, `propertyset`) VALUES (11, 'OnDocFormSave', 0, 0) Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '11-OnDocFormSave' for key 'PRIMARY' ) 
Error 23000 executing statement: INSERT INTO `modx_site_plugin_events` (`pluginid`, `event`, `priority`, `propertyset`) VALUES (11, 'OnWebPagePrerender', 0, 0) Array ( [0] => 23000 [1] => 1062 [2] => Duplicate entry '11-OnWebPagePrerender' for key 'PRIMARY' )
Script resolver actions completed
Attempting to preserve files at C:/wamp/www/trevo.ru/core/components/supercache into archive C:/wamp/www/trevo.ru/core/packages/supercache-1.0.0-pl/modCategory/96cc0f4d68051738a704ab71c29812a2.2.preserved.zip
Skipping vehicle object of class modSystemSetting (data object exists and cannot be upgraded); criteria: Array ( [key] => supercache.excludeResources ) 
Skipping vehicle object of class modSystemSetting (data object exists and cannot be upgraded); criteria: Array ( [key] => supercache.includeResources ) 
Skipping vehicle object of class modSystemSetting (data object exists and cannot be upgraded); criteria: Array ( [key] => supercache.timeLimit ) 
Успешно установлен пакет supercache-1.0.0-pl
avatar
Пожалуйста, игнорируйте мой прдыдущий пост, устанавливал из репозитория модх, там оказывается есть плагин с точно таким же названием и схожим описанием Your text to link.... Это просто случайность или не совсем? )) Что-то надо переименовать, чтобы не путаться.

Выводится предупреждение:

Notice: Undefined index: cache_prefix in C:\wamp\www\trevo.ru\core\components\supercache\supercache_read_cache.php on line 47
avatar
Валентин, помогите, пожалуйста!

При установке компонента на хостинге оказывается невозможным удалить ни один из файлов компонента — 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 может я неправильно где-то конфиг настроил?)
При удалении компонента сайт начинает работать.
avatar
версия php какая?
avatar
PHP/5.2.12 with Suhosin-Patch

Прошу прощения, возможно проблема с невозможностью удалить файлы связана не с модулем, а с хостингом и самим modx. Т.к. невозможно удалить только те файлы и папки, которые создаются из modx.Когда скопировал файлы на хостинг — все удалялось кроме кеша. Потом удалил и заново установил компонент (т.е. он уже на хостинге средствами modx распаковался) и файлы компонента перестали удаляться. Так что проблема видимо в modx((

Вопрос только по 500 ошибке во фронтенде и ошибкам с php.

Вот другие параметры хостера (может что-то еще подскажете):
modx 2.2.7
Apache/2.0.63 (FreeBSD)
MySQL client version: 5.1.24-rc
avatar
в итоге поменял хостинг и все заработало
avatar
После установки пакета, вставьте инклуд в файл 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
Вставил. Появилась ошибка 500…
MODX Revolution 2.2.7-pl (traditional)
PHP Version 5.2.17
avatar
Revo 2.2.7-pl
* был затык — разобрался
хостинг от Sweb.ru не сразу апдейтиться на (php 5.3)
** правда на вкладке «параметры» нет опций
Комментарий отредактирован 2013-07-25 17:53:39 пользователем doc555
avatar
Добрый день, потестировал с Shopkeeper, к сожалению, состояние корзины кешируется, если на одной странице сделать заказ, при переходе на другую корзина теряется((
Комментарий отредактирован 2013-10-26 08:32:30 пользователем manicko
avatar
Это пример для простых статических страниц. Для динамики, нужно писать логику, не всё так просто, как вам кажется на первый взгляд. И я не уверен, что Магазин таким скриптом можно закэшировать (там много динамики), а если и можно — то нужно подумать, стоит ли оно этого?
avatar
Согласен, слишком много динамики там, поэтому логичнее через стандартный кеш делать.
В любом случае, спасибо, на тесте прирост скорости огромный получался.
avatar
Здравствуйте, Валентин. Помогите, пожалуйста. modx 2.2.10
Не появляется чекбокс в ресурсе. Ошибок никаких не выдает.
Комментарий отредактирован 2013-11-22 22:57:44 пользователем scorpionxxx
avatar
Добрый день! не нашол я где жти параметры менять cs_cache_checkbox_defaulr
подскажите
avatar
создадим алгоритм работы и немного усовершенствуем наш плагин, чтобы не очищать весь кэш сайта.

это уже реализовано?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.