Drupal разбирает хуки, которые не используются? - PullRequest
3 голосов
/ 14 июля 2009

Drupal анализирует (и / или запускает) хуки, которые не связаны с контентом, загружаемым текущим пользователем?

Например, скажем, у меня установлен модуль foo и он активен со следующими хуками:

<?php 
// .. stuff ...    
function foo_menu() {
      $items = array();
      $items['foo/show'] = array(
        'title' => t('Foo!'),
        'page callback' => 'foo_display_all',
        'description' => 'All our foo are belong to you',
        'type' => MENU_NORMAL_ITEM,
      );
      return $items;
    }

    function foo_display_all() {
    // About 100 lines of code
    }
// ... stuff ...

Будет ли Drupal анализировать (и, следовательно, влиять на время загрузки) страницы, которые не перечислены в foo_menu? Другими словами, повлияет ли длина и сложность foo_display_all на загрузку www.example.com/bar?

Риск иметь здесь два разных вопроса, я скажу, что был бы благодарен за объяснение (или ссылку на объяснение) того, как и почему Drupal выполняет или не анализирует, а не за ответ да / нет. 1011 *

Ответы [ 5 ]

6 голосов
/ 14 июля 2009

hook_menu используется, чтобы сообщить drupal о том, что делать с определенными URL-адресами, поэтому результат этого кэшируется.

Drupal будет выполнять только содержимое хуков, а не все содержимое файла, в котором они находятся. Поэтому, когда в вышеупомянутом примере вызывается меню хуков, будет запущена функция foo_menu (). Вы можете взглянуть на вступительный текст в Hooks API

Edit: Чтобы PHP выполнял функцию, ему нужно включить файл, в котором он находится. Поэтому, когда Drupal хочет выполнить хук, PHP должен будет проанализировать код в этом файле. Так устроен PHP, поэтому не имеет ничего общего с Drupal.

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

4 голосов
/ 15 июля 2009

Да. Как уже отмечали другие, разделение элементов на включаемые файлы, которые загружаются условно, - единственный способ сократить это. Начиная с Drupal 6, стало возможным перемещать функции theme_whwhat (), а также обратные вызовы страницы hook_menu (), в отдельные включаемые файлы. Drupal автоматически загрузит их, когда они понадобятся, без каких-либо явных манипуляций с require_once ().

Подробнее см. В документации hook_menu () и hook_theme () .

Также важно отметить, что если вы используете кэш кода операции, такой как APC, разделение элементов на кучу условных включений на самом деле хуже - APC может выполнять весь анализ и компиляцию PHP источник за один раз и сохранить его между запросами. Условное разделение всего лишь дает ему несколько дискретных «кодовых баз» для компиляции в зависимости от того, что делается.

В Drupal 7, находящемся в стадии разработки, был добавлен общий Реестр кода , позволяющий разбить любую реализацию хука на отдельный включаемый файл. Однако накладные расходы на управление этим внутренним кешем функций и местоположений .inc и их загрузку на лету съедают прирост производительности при уменьшении для анализа кодовой базы. Единственная реальная выгода - уменьшенное использование памяти для тех на общих хостах с жесткими ограничениями памяти на 12-16 мегабайт; неясно, дойдут ли эти изменения до финальной версии Drupal 7, учитывая компромиссы.

Результат: в Drupal 6, разделил колбэки меню, которые создают пользовательские страницы в отдельный файл .inc, и он будет загружен только при построении этих страниц. Сделайте то же самое с любыми функциями темы. И если вы используете кэш опкодов , такой как APC, помните, что ваши отдельные файлы .inc хороши только для организационных целей - они не дадут вам никакого повышения производительности.

3 голосов
/ 14 июля 2009

Во-первых, я не опытный разработчик Drupal, во-вторых, это не очень хорошая реализация, и в-третьих, я не пробовал это, но должно работать

function foo_display_all() {
    include("foo_display_all_body.php");
}

Таким образом, каждый раз анализируются хуки, + один дополнительный php-файл с телом функции.

В-четвертых, это микрооптимизация. Может быть лучше избежать этого, если в этом нет крайней необходимости, поскольку дополнительная сложность (и чтение файла +1) может в долгосрочной перспективе стоить вам дороже, чем экономить при разборе.

Если вы хотите ускорить синтаксический анализ php-кода, вам следует использовать кэш кода операции

3 голосов
/ 14 июля 2009

Drupal включает все файлы MODULE.module (и все, что они включают) для каждого модуля для каждого запроса.

Единственный способ для ядра Drupal узнать, есть ли у модуля какие-либо хуки, которые ему нужно вызвать, это загрузить файл. Это займет время и память.

0 голосов
/ 27 января 2010

APC теперь, похоже, кеширует файлы .inc, а также php, что значительно повышает производительность.

...