Эта тема на forum.dklab.ru


Adreo: Работа с модулями в CMS
Доброго времени суток.

У меня появился очень интересующий меня вопрос по поводу работы с модулями в CMS. Принцип работы такой: есть ядро и есть подключаемые модули. Ядро получает запрос от пользователя, обрабатывает его (определяет вызываемый модуль, язык и пр.), посылает запрос модулю, получает ответ с данными и выводит информацию пользователю. Так вот проблема как раз в связке "посылает запрос модулю - получает ответ с данными". Ниже небольшой кусок кода, который реализует подобный интерфейс взаимодействия с модулями:


function call_module(&$module, &$language, &$module_params, $post_array)
{
$modules_manager = new modules_manager();
$module_settings = $modules_manager->get_module_parameters_from_db($module);
include ("modules/". $module_settings[0]["module_path"] . "/index.php");
$module = new module($language);
$content = $module->get_data($module_params, $post_array);
return $content;
}


А проблема в том, что, во-первых, внутри функции делается include. Сначала это была функция call_user_func_array, но она дико увеличивала время выполнения скрипта. Во-вторых, очень большие объёмы информации передаются между модулем и ядром. К примеру, просто при извлечении из базы и выводе данных используется гораздо меньше памяти и загрузки процессора.

Подскажите, как лучше оптимизировать подобный подход к подключению модулей? Может, кто-то подскажет лучший способ сделать это?
NoN:
А зачем передавать информацию между модулем и ядром? Ведь по поведению "include файл.php;" равен "?>содержание_файла.php<?php", т.е. доступны все глобальные и суперглобальные переменные. Только внимание, если в файле модуля определяются функции, то при повторном вызове модуля они переопределятся и это вызывет ошибку. Нужно или использовать include_once, или проверять существование определяемых функций.

Я бы сделал так:
Подключение модулей.
Foreach ($modfiles as $v) include_once $v;

Модуль:
<? function f1($a,$b) {return $a*$b;}
function f2($a,$b) {return $a+$b;}

$modfunc['mymod_mul']='f1';
$modfunc['mymod_add']='f2';
?>

Вызов из "ядра".
if (isset($modfunc['mymod_add'])) echo $modfunc['mymod_add']($a,$b);
Adreo:
NoN
А смысл? Всё равно данные передаются в массиве! Причём в этот массив Вы забиваете данные не от конкретной функции, которая должна обработать запрос, а вообще все, которыми располагает модуль.

Я основывал свой принцип на том, чтобы при запросе использовалось как можно меньше ресурсов - подгружался только конкретно выбранный модуль и выдавал только необходимую запрошенную информацию.
NoN:
Я описал то, что делал я. Конечно же можно не все модули грузить. Кто сказал, что $modfiles - все модули? Может быть там 1, который нужен.
Примерно так подключаются dll'ки - экспортитуют списки функций.

А данные не передаются вообще. Разве что в массиве $GLOBALS. :) Не занимайтесь ложной оптимизацией. Боитесь лишнего кода - пишите CGI на ассемблере для ОС вашего сервера.

Эта тема на forum.dklab.ru