-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
"сборка" всех конфигов в один файл #148
Comments
У тебя есть под рукой сайт с 20-30 плагинами? Можешь замерить сколько времени уходит загрузку конфигов плагинов? |
На том, что у меня есть чистого результат невозможно добиться - хороший выделенный сервер или виртуалка на рабочем компе. Но сейчас тенденция в хостингах склоняется к облакам, а там, по собственному опыту, основной затык в подсистеме ввода-вывода и сокращение постоянных файловых операций это плюс. |
Как видим, разница между 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); Идея хорошая, но дело в том, что, например, у смарти десятки плагинов есть в поставке и они все загружаются при старте, а пользуемся мы только одним десятком. Можно удалить часть. |
На продакшене было бы очень неплохо заиметь возможность единоразовой сборки всех конфигов в один файл, чтобы при открытии каждой страницы не открывать кучу файлов конфигов от каждого плагина. Пусть проверка на их изменение и делается на уровне самого PHP но когда на сайтах бывает по 20-30 плагинов все эти телодвижения все равно лишние, плюс можно собирать ФИНАЛЬНУЮ версию конфига, т.е. со всеми изменениями при наследовании и всем таком - т.е. убрать из загрузки КАЖДОЙ страницы эту работу. Привязать пересборку, скажем, к глобальной очистке кэша или отдельным пунктом админки.
Да, тут имеются потенциальные проблемы с какими-то редкими случаями, но в таких случаях можно каким-то образом объявлять такие конфиги динамическими и обрабатывать их каждый раз, но, мне кажется, это мегаредкая проблема и в подавляющем большинстве случаев конфиги будут собираться один раз.
The text was updated successfully, but these errors were encountered: