3

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如何以及为什么解析或不解析的解释(或解释的链接),而不是一个是/否的答案。

4

5 回答 5

6

hook_menu 用于告诉 drupal 在特定 url 上做什么,因此结果被缓存。

Drupal 只会执行钩子本身的内容,而不是它们所在文件的全部内容。因此,当在上面的示例中调用钩子菜单时,将运行 foo_menu() 函数。您可以查看Hooks API中的介绍文本

编辑:为了让 PHP 执行该函数,它需要包含它所在的文件。所以当 Drupal 想要执行一个钩子时,PHP 需要解析该文件中的代码。这就是 PHP 的设计方式,因此与 Drupal 没有太大关系。

这也是很多模块制作大量inc文件的原因,以限制触发钩子时需要解析的代码量。

于 2009-07-14T12:40:40.263 回答
4

是的。正如其他人所指出的,将内容拆分为有条件加载的包含文件是减少这种情况的唯一方法。从 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 文件仅适用于组织目的——它们不会给您带来任何性能提升。

于 2009-07-14T22:42:05.540 回答
3

Drupal 包含每个请求的每个模块的所有 MODULE.module 文件(以及它们包含的任何内容)。

Drupal 核心知道模块是否有任何需要调用的钩子的唯一方法是加载文件。这需要时间和记忆。

于 2009-07-14T14:00:56.217 回答
3

首先,我不是经验丰富的 Drupal 开发人员,其次,这不是一个很好的实现,第三,我没有尝试过,但应该可以

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

这样每次都会解析钩子,+ 一个带有函数体的附加 php 文件。

四是微优化。如果不是绝对必要的话,最好避免它,因为从长远来看,额外的复杂性(和 +1 文件读取)可能比它节省的解析成本更高。

如果你想让 php 代码解析更快,你应该使用操作码缓存

于 2009-07-14T15:28:28.677 回答
0

APC 现在似乎缓存 .inc 文件以及 php,这确实极大地提升了性能。

于 2010-01-27T05:38:52.297 回答