livestreet-framework
livestreet-framework copied to clipboard
"сборка" всех конфигов в один файл
На продакшене было бы очень неплохо заиметь возможность единоразовой сборки всех конфигов в один файл, чтобы при открытии каждой страницы не открывать кучу файлов конфигов от каждого плагина. Пусть проверка на их изменение и делается на уровне самого PHP но когда на сайтах бывает по 20-30 плагинов все эти телодвижения все равно лишние, плюс можно собирать ФИНАЛЬНУЮ версию конфига, т.е. со всеми изменениями при наследовании и всем таком - т.е. убрать из загрузки КАЖДОЙ страницы эту работу. Привязать пересборку, скажем, к глобальной очистке кэша или отдельным пунктом админки.
Да, тут имеются потенциальные проблемы с какими-то редкими случаями, но в таких случаях можно каким-то образом объявлять такие конфиги динамическими и обрабатывать их каждый раз, но, мне кажется, это мегаредкая проблема и в подавляющем большинстве случаев конфиги будут собираться один раз.
У тебя есть под рукой сайт с 20-30 плагинами? Можешь замерить сколько времени уходит загрузку конфигов плагинов?
На том, что у меня есть чистого результат невозможно добиться - хороший выделенный сервер или виртуалка на рабочем компе. Но сейчас тенденция в хостингах склоняется к облакам, а там, по собственному опыту, основной затык в подсистеме ввода-вывода и сокращение постоянных файловых операций это плюс.
сайт с 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);
Идея хорошая, но дело в том, что, например, у смарти десятки плагинов есть в поставке и они все загружаются при старте, а пользуемся мы только одним десятком. Можно удалить часть.