Существует ли потенциальная потеря производительности при использовании нескольких вызовов nodeapi вместо одного?
У меня довольно большой сайт с несколькими пользовательскими модулями. Я начал разбивать некоторые из более крупных модулей на более мелкие, более удобные для обслуживания.
У меня есть один конкретный модуль, который я разделяю на три. У него есть функция hook_nodeapi, которая выполняет разные функции, будет ли большая потеря производительности при разделении одного вызова nodeapi на 2 или 3? Кто-нибудь проводил какие-либо тесты по этому вопросу?
1 answers
При использовании дополнительных модулей происходит снижение производительности. В основном из-за большего количества открывающего синтаксического анализа и function_exists() и использования памяти.
Api узла в 6 будет вызываться для каждого действия узла и вызываться для каждого узла. (в 7 узлах можно использовать несколько узлов одновременно, и для каждого действия есть отдельный крючок)
Так что, если вы будете осторожны:
- Поместите весь свой код в переключатель ($op);
- Проверьте типы контента, чтобы работать над тем, что вам нужно
- Сохраняйте запросы к БД в минимум
Накладных расходов будет немного (некоторые, но не подавляющие).
Если, с другой стороны, ваш вызов nodapi, общий доступ к запросам БД (или может совместно использовать запросы БД), имеет много общих настроек/кода, то вы можете начать снижать производительность.
Один из способов обойти это - быть немного более избирательным в отношении кода, который вы включаете:
mymodule_nodeapi($op, ...) {
switch($op) {
case 'load':
// Insert common code here.
if ($node->type == 'my_complex_node_type') {
module_load_include('inc', 'mymodule', 'complex_type');
mymodule_complex_load($node);
elseif ($node->type == 'some_other_node_type') {
module_load_include('inc', 'mymodule', 'other_type');
mymodule_other_load($node);
}
break;
}
}
Грубый псевдокод
Вы можете хранить свой код в отдельных файлах, чтобы повысить удобство обслуживания и сократите время загрузки, так как файлы включаются/анализируются только при необходимости.
Недостатком является то, что вам нужно самостоятельно управлять включением и обратным вызовом, а не полагаться на module_invoke_all.