Прекрасный по всем параметрам продукт InstantCMS 2 в версиях до 2.0.1 включительно имеет один недостаток, влияющий на производительность – неоптимизированные подключения файлов классов и библиотек. Например, при открытии главной страницы под админским логином выполняется более 800 попыток подключения по сути одних и тех же файлов.
Данный хак добавляет проверку на уже выполненное подключение перед вызовом подключений классов и библиотек. Это позволяет уменьшить время создания страницы более чем в полтора раза с полным сохранением функциональности сайта.
Можем сравнить увеличение скорости на разных компьютерах, если есть желание – пишите в каментах.
Например, время создания главной страницы сайта у меня уменьшилось с 375 до 231 мс для гостя и с 535 до 303 мс для входа под админом. То есть, стало в 1.6-1.7 раза быстрее.
Количество попыток инклудов уменьшилось, соответственно, с 645 до 89 и с 827 до 113.
Параметры тестирования:
версия с расширенной отладкой;
процессор Core i5 3.5 ГГц;
Указаны самые минимальные значения из всех полученных после пары десятков обновлений страницы.
Дальнейшее уменьшение количества подключений файлов возможно лишь за счёт исключения загрузки ненужных компонентов при старте ядра (а лишнее таки загружается, это можно увидеть при включении опции «Показывать инклуды» в расширенной отладке). Также, на мой взгляд, можно уменьшить количество инклудов и время работы PHP, если как-то организовать подключение всех (или большинства) классов через autoload. Но это уже вопросы r2, он знает внутренности системы и возможность такого варианта.
В любом случае, 300 мс на создание главной страницы в такой мощной и гибко настраиваемой CMS – шикарный результат. Спасибо разработчикам за прекрасную систему.
Изменяемые файлы:
\system\core\config.php
\system\core\core.php
\system\core\form.php
\system\core\eventsmanager.php
\system\core\mailer.php
\system\core\model.php
\system\controllers\typograph\hooks\html_filter.php
Изменённые файлы можно скачать одним архивом:
Для чистой версии 2.0.0 или 2.0.1
Для версии 2.0.0 или 2.0.1 с расширенной отладкой
Достаточно распаковать архивы в папку с установленным сайтом с заменой файлов.
В дальнейшем все новые версии Расширенной отладки будут уже со встроенной этой оптимизацией.
Для желающих разобраться в хаке поглубже или для варианта, когда у вас уже есть свои изменения в этих файлах, привожу полный список изменений для чистой версии (без расширенной отладки).
Для начала, если у вас версия без расширенной отладки, нужно вставить пару строк в файл index.php в корне сайта, чтобы увидеть время создания страниц. После проверки оптимизации эти строки можно будет закомментировать или удалить.
index.php
в самом начале файла, перед всеми строками
в самом конце, после всех строк
После этого можно обновить страницу и внизу под страницей будет написано время её создания.
В версии с расширенной отладкой это и многое другое сразу отображается в таблице отладки. Есть смысл записать значения без оптимизации, чтобы потом посчитать ускорение.
А теперь, собственно, оптимизация.
\system\core\config.php
после строки 5 добавляем
и меняем функцию getControllersMapping() на
\system\core\core.php
после строки 5 добавляем
в функции getFilesList()
меняем на
в функции loadLanguage()
меняем на
в функции getController()
меняем на
и
меняем на
в функции runWidget()
меняем на
\system\core\form.php
после строки 5 добавляем
и в функции getForm() меняем
на
\system\core\eventsmanager.php
после строки 2
добавляем
и меняем функцию
\system\core\mailer.php
в строке 11
меняем на
\system\core\model.php
в строках 1376 и 1391
меняем на
\system\controllers\typograph\hooks\html_filter.php
в строке 27
меняем на
Данный хак добавляет проверку на уже выполненное подключение перед вызовом подключений классов и библиотек. Это позволяет уменьшить время создания страницы более чем в полтора раза с полным сохранением функциональности сайта.
Можем сравнить увеличение скорости на разных компьютерах, если есть желание – пишите в каментах.
Например, время создания главной страницы сайта у меня уменьшилось с 375 до 231 мс для гостя и с 535 до 303 мс для входа под админом. То есть, стало в 1.6-1.7 раза быстрее.
Количество попыток инклудов уменьшилось, соответственно, с 645 до 89 и с 827 до 113.
Параметры тестирования:
версия с расширенной отладкой;
процессор Core i5 3.5 ГГц;
Указаны самые минимальные значения из всех полученных после пары десятков обновлений страницы.
Дальнейшее уменьшение количества подключений файлов возможно лишь за счёт исключения загрузки ненужных компонентов при старте ядра (а лишнее таки загружается, это можно увидеть при включении опции «Показывать инклуды» в расширенной отладке). Также, на мой взгляд, можно уменьшить количество инклудов и время работы PHP, если как-то организовать подключение всех (или большинства) классов через autoload. Но это уже вопросы r2, он знает внутренности системы и возможность такого варианта.
В любом случае, 300 мс на создание главной страницы в такой мощной и гибко настраиваемой CMS – шикарный результат. Спасибо разработчикам за прекрасную систему.
Изменяемые файлы:
\system\core\config.php
\system\core\core.php
\system\core\form.php
\system\core\eventsmanager.php
\system\core\mailer.php
\system\core\model.php
\system\controllers\typograph\hooks\html_filter.php
Изменённые файлы можно скачать одним архивом:
Для чистой версии 2.0.0 или 2.0.1
Для версии 2.0.0 или 2.0.1 с расширенной отладкой
Достаточно распаковать архивы в папку с установленным сайтом с заменой файлов.
В дальнейшем все новые версии Расширенной отладки будут уже со встроенной этой оптимизацией.
Для желающих разобраться в хаке поглубже или для варианта, когда у вас уже есть свои изменения в этих файлах, привожу полный список изменений для чистой версии (без расширенной отладки).
Для начала, если у вас версия без расширенной отладки, нужно вставить пару строк в файл index.php в корне сайта, чтобы увидеть время создания страниц. После проверки оптимизации эти строки можно будет закомментировать или удалить.
index.php
в самом начале файла, перед всеми строками
После этого можно обновить страницу и внизу под страницей будет написано время её создания.
В версии с расширенной отладкой это и многое другое сразу отображается в таблице отладки. Есть смысл записать значения без оптимизации, чтобы потом посчитать ускорение.
А теперь, собственно, оптимизация.
\system\core\config.php
после строки 5 добавляем
private static $mapping; // Для хранения массива ремапов на время работы скрипта
public static function getControllersMapping(){ if (!self::$mapping) { self::$mapping = true; $map_file = 'system/config/remap.php'; $map_function = 'remap_controllers'; if (!cmsCore::includeFile($map_file)) { return false; } } return self::$mapping; }
\system\core\core.php
после строки 5 добавляем
private static $loadlanguage_include; // Массив уже подключённых файлов для функции loadLanguage private static $getfileslist_include; // Массив уже подключённых файлов для функции getFilesList
if ($is_include) { include_once $file; }
if ($is_include) { include_once $file; self::$getfileslist_include[$file] = true; } }
return self::includeFile($lang_file);
self::$loadlanguage_include[$lang_file] = true; return self::includeFile($lang_file); } else { return true; }
в функции getController()
include_once($ctrl_file);
include_once($custom_file); $controller_class = $controller_name . '_custom';
$controller_class = $controller_name . '_custom';
cmsCore::includeFile($file); cmsCore::loadWidgetLanguage($widget['name'], $widget['controller']); $class = 'widget' . ($widget['controller'] ? string_to_camel('_', $widget['controller']) : '') . string_to_camel('_', $widget['name']);
$class = 'widget' . ($widget['controller'] ? string_to_camel('_', $widget['controller']) : '') . string_to_camel('_', $widget['name']); cmsCore::loadWidgetLanguage($widget['name'], $widget['controller']);
\system\core\form.php
после строки 5 добавляем
private static $fields_load; // Признак того, что классы полей уже загружены
cmsForm::loadFormFields(); include_once $form_file; $form_class = 'form' . string_to_camel('_', $form_name);
if (!self::$fields_load) { cmsForm::loadFormFields(); self::$fields_load = true; } $form_class = 'form' . string_to_camel('_', $form_name);
\system\core\eventsmanager.php
после строки 2
class cmsEventsManager {
private static $structure; // Для хранения структуры списка хуков
public static function getEventListeners($event_name){ if (!self::$structure) self::$structure = self::getAllListeners(); return $listeners; }
\system\core\mailer.php
в строке 11
cmsCore::loadLib('phpmailer/class.phpmailer');
\system\core\model.php
в строках 1376 и 1391
cmsCore::loadLib('spyc.class');
\system\controllers\typograph\hooks\html_filter.php
в строке 27
cmsCore::loadLib('jevix.class');
Реклама #
NeBox 10 лет назад #
Инклуды с 842 уменьшились до 118 для админа(под юзером не смотрел)
Вообще у меня тормозят все локальные сайты на php >= 5.3
full time: с 1385.1 ms до 1310.1 ms - не особо поправило. На сервере лучше конечно будет.
WebMan 10 лет назад #
Aryuts 10 лет назад #
picaboo 10 лет назад #
Dublic 10 лет назад #
WebMan 10 лет назад #
Например, при открытии любой страницы с контентом (даже просто "О сайте" без каментов и виджетов под гостем) загружаются, компилируются и выполняются все 20 файлов с полями форм, независимо от их использования или не использования. Эта логика "зашита" в контроллер контента (\system\controllers\content\model.php). Я ещё не разбирался в ядре настолько глубоко, чтобы понять, как это обойти. Но думаю, что возможности есть. Даже только загрузка классов полей формы по требованию вместо полной загрузки при старте позволила бы уменьшить время создания страницы ещё на 15-20 мс. При открытии простой страницы типа "О сайте" на моём компе за 160 мс увеличение скорости было бы примерно на 10%. Тоже хороший плюс.
Или, например, загрузка классов кэширования происходит независимо от включения/выключения этого кэширования в настройках и реального использования кэша. Логика кода, в принципе, понятна: делать проверку включения кэширования только в самом классе кэширования для структурирования кода и более точного соответствия парадигме ООП. Но я бы от этого отказался ради производительности. Поскольку название параметра конфига 'cache_enabled' вряд ли будет меняться в будущем, то выгоднее в паре мест кода вне класса кэширования сделать проверку этого параметра и просто не загружать ничего, связанного с кэшированием, если оно выключено. Это даст выигрыш в 2-4 мс и дополнительную экономию памяти.
Где-то выиграть пару-тройку мс, где-то больше - можно ускорить движок ещё раза в полтора.
Предложеный мной вариант оптимизации из этого топика - делать проверку на уже выполненное подключение файлов - может быть тоже не самый лучший. Это просто оперативный хак. Возможно, если понять логику ядра, то можно вообще сделать так, чтобы не было этих сотен попыток и проверок, что ещё больше ускорит двиг и сократит потребление памяти. Но тут нужно потратить много времени на понимание всех связей. Да и не факт, что разработчиков это заинтересует.
И, кстати, о кэшировании. Оно сейчас сделано достаточно мягким и динамичным: кэшируются виджеты, небольшие блоки информации (списки событий) и т.д., а потом из этих кусочков кэша собирается страничка. Это увеличивает скорость сборки страницы всего процентов на 30 при использовании memcache, зато делает кэширование более динамичным. При этом всё равно загружается, компилируется и частично выполняется достаточно много лишнего кода - это следствие хорошей структурированности кода и следования ООП. Если добавить ещё один режим кэширования, более полный, когда, например, гостям будут отдаваться готовые страницы целиком из кэша, то можно генерить страницы раза в два и более быстрее даже без использования прокси. Можно будет разделять гостей и зарегистрированных пользователей, отдавая им сайт, соответственно, из кэша и без него. И это вообще будет полезно как в случае неожиданного пикового наплыва посетителей, так и для "обычных" сайтостроителей, не разбирающихся в особенностях вебсерверов, позволяя некоторое время прожить на старых серверах и тарифах.
В-общем, возможностей для оптимизации ещё много. Согласен с Aryuts, что движок молодой, его ещё можно и нужно совершенствовать во многих направлениях. Хотя по-честному, уже сейчас даже с минимальной оптимизацией InstantCMS 2 легко делает по удобству и функционалу другие популярные движки при не меньшей, а часто заметно лучшей производительности и меньшем потреблении памяти. Так что разработчики действительно постарались на славу. За что им большая благодарность!
WebMan 10 лет назад #
Александр 10 лет назад #
leo748 10 лет назад #
WebMan 10 лет назад #
Оптимизацию Вы делали накатом файлов из архива или ручками по списку изменений? У Вас до оптимизации уже были изменены какие-то из перечисленных в топике файлов? Или другие файлы были изменены - какие?
leo748 10 лет назад #
WebMan 10 лет назад #
Попробуйте Класс расширенной отладки из этой ссылки. Во-первых, там уже есть все мои оптимизации на данный момент. Во-вторых, там есть отладка, которая может быть Вам полезна как для оценки скорости сайта, так и для других целей.
GoodNet 10 лет назад #
Просто куда не нужного кода показывается гостям. Готов заплатить.
zotak 10 лет назад #
WebMan 10 лет назад #
oll 10 лет назад #
wcw2007 4 года назад #
WebMan 4 года назад #