livestreet-framework icon indicating copy to clipboard operation
livestreet-framework copied to clipboard

"сборка" всех конфигов в один файл

Open kerbylav opened this issue 9 years ago • 3 comments

На продакшене было бы очень неплохо заиметь возможность единоразовой сборки всех конфигов в один файл, чтобы при открытии каждой страницы не открывать кучу файлов конфигов от каждого плагина. Пусть проверка на их изменение и делается на уровне самого PHP но когда на сайтах бывает по 20-30 плагинов все эти телодвижения все равно лишние, плюс можно собирать ФИНАЛЬНУЮ версию конфига, т.е. со всеми изменениями при наследовании и всем таком - т.е. убрать из загрузки КАЖДОЙ страницы эту работу. Привязать пересборку, скажем, к глобальной очистке кэша или отдельным пунктом админки.

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

kerbylav avatar Jun 16 '15 03:06 kerbylav

У тебя есть под рукой сайт с 20-30 плагинами? Можешь замерить сколько времени уходит загрузку конфигов плагинов?

mzhelskiy avatar Jun 16 '15 03:06 mzhelskiy

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

kerbylav avatar Jun 16 '15 03:06 kerbylav

сайт с 20-30 плагинами? Можешь замерить сколько времени уходит загрузку конфигов плагинов?

  • Загрузка главной страницы, лс 1.0.3, измерялось локально, в попугаях
Количество плагинов Время загрузки конфигов, сек
72 0.13442087173462
10 0.037338972091675
0 0.00036406517028809

Как видим, разница между 0 плагинов и 10 штук - составляет 100 раз, а разница между 72 и 10 плагинами - 4 раза, можно сказать следующее: если начали ставить плагины, то почти без разницы количество. Конечно плагин плагину рознь, но можно задуматься.

Виноватец торжества:

$a = microtime(true);
/**
 * Загружает конфиги плагинов вида /plugins/[plugin_name]/config/*.php
 * и include-файлы /plugins/[plugin_name]/include/*.php
 */
$sPluginsDir = Config::Get('path.root.server').'/plugins';
$sPluginsListFile = $sPluginsDir.'/'.Config::Get('sys.plugins.activation_file');
if($aPluginsList=@file($sPluginsListFile)) {
    $aPluginsList=array_map('trim',$aPluginsList);
    foreach ($aPluginsList as $sPlugin) {
        $aConfigFiles = glob($sPluginsDir.'/'.$sPlugin.'/config/*.php');
        if($aConfigFiles and count($aConfigFiles)>0) {
            foreach ($aConfigFiles as $sPath) {
                $aConfig = $fGetConfig($sPath);
                if(!empty($aConfig) && is_array($aConfig)) {
                    // Если конфиг этого плагина пуст, то загружаем массив целиком
                    $sKey = "plugin.$sPlugin";
                    if(!Config::isExist($sKey)) {
                        Config::Set($sKey,$aConfig);
                    } else {
                        // Если уже существую привязанные к плагину ключи,
                        // то сливаем старые и новое значения ассоциативно
                        Config::Set(
                            $sKey,
                            func_array_merge_assoc(Config::Get($sKey), $aConfig) 
                        );
                    }
                }
            }
        }
        /**
         * Подключаем include-файлы
         */
        $aIncludeFiles = glob($sPluginsDir.'/'.$sPlugin.'/include/*.php');
        if($aIncludeFiles and count($aIncludeFiles)) {
            foreach ($aIncludeFiles as $sPath) {
                require_once($sPath);
            }       
        }
    }
}
$b = microtime(true);
die($b - $a);

Идея хорошая, но дело в том, что, например, у смарти десятки плагинов есть в поставке и они все загружаются при старте, а пользуемся мы только одним десятком. Можно удалить часть.

psnet avatar Jun 16 '15 14:06 psnet