Разбирает ли Drupal хуки, которые не используются?

Разбирает ли 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 делает или не анализирует, а не за ответ да/нет.


person anschauung    schedule 14.07.2009    source источник


Ответы (5)


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

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

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

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

person googletorp    schedule 14.07.2009
comment
Спасибо. Но меня больше интересовало, будут ли файлы считываться и анализироваться — я благодарен Drupal за то, что он достаточно умен, чтобы фактически не выполнять неиспользуемые функции, но я не знаю, читает ли он их/анализирует, а затем игнорирует или если он вообще их не читает, если они не нужны. Возможно, это то, что вы имели в виду? - person anschauung; 14.07.2009
comment
Я думаю, что да, если вы не хотите, чтобы он использовал файл inc. - person Jeremy French; 14.07.2009
comment
Спасибо за объяснение. Ваш ответ об использовании файлов .inc несколько противоречит ответу Крейга ниже, но я отправлю новый вопрос, чтобы решить эту проблему. - person anschauung; 14.07.2009

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

См. hook_menu() и hook_theme() для получения подробной информации.

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

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

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

person Eaton    schedule 14.07.2009

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

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

person Craig    schedule 14.07.2009
comment
Спасибо за объяснение. Ваш комментарий об использовании файлов .inc несколько противоречит ответу @googletorp, но я полагаю, что новый вопрос - лучший способ решить эту проблему. - person anschauung; 14.07.2009
comment
Если в файле .module есть оператор включения внутри функции, тогда включенный файл читается только при вызове функции. Если включение находится в глобальной области, включаемый файл всегда читается. - person Craig; 14.07.2009

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

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

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

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

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

person Csaba Kétszeri    schedule 14.07.2009

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

person dfg    schedule 27.01.2010