代码之家  ›  专栏  ›  技术社区  ›  anschauung

Drupal是否解析未使用的钩子?

  •  3
  • anschauung  · 技术社区  · 16 年前

    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 ...
    

    foo_menu foo_display_all

    冒着有两个不同问题的风险,我会说,如果能解释(或链接到解释)Drupal如何以及为什么解析或不解析,而不是一个是/否的答案,我将不胜感激。

    5 回复  |  直到 15 年前
        1
  •  6
  •   googletorp    16 年前

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

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

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

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

        2
  •  4
  •   Eaton    16 年前

    对。正如其他人所指出的那样,将内容拆分为有条件加载的包含文件是减少这种情况的唯一方法。从Drupal 6开始,可以将theme_whatever()函数以及hook_munu()页面回调移动到单独的包含文件中。Drupal会在需要时自动加载它们,而无需您进行任何显式的require_once()操作。

    请参阅 hook_menu() hook_theme() 详细文档。

    同样重要的是要注意,如果你运行的是像APC这样的操作码缓存,将内容拆分为一堆条件包含实际上是 更糟 --APC可以一次性完成PHP源代码的所有解析和编译,并在请求之间持久化。有条件地拆分东西只会根据正在做的事情给它多个离散的“代码库”进行编译。

    在目前正在开发的Drupal 7中 Code registry 添加了允许将任何钩子实现拆分为单独的包含文件的功能。然而,管理函数和.inc位置的内部缓存并动态加载它们的开销会消耗较小的解析代码库的性能增益。唯一真正的回报是减少了共享主机上12-16兆内存限制的内存使用;考虑到权衡,尚不清楚这一变化是否会持续到Drupal 7的最终版本。

    结果: 在Drupal6中,将构建自定义页面的菜单回调拆分为一个单独的.inc文件,只有在构建这些页面时才会加载。对任何主题函数都做同样的操作。和 如果您正在使用操作码缓存 像APC一样,请记住,单独的.inc文件只适用于组织目的——它们不会给您带来任何性能提升。

        3
  •  3
  •   Craig    16 年前

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

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

        4
  •  3
  •   Csaba Kétszeri    16 年前

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

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

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

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

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

        5
  •  0
  •   Toon Krijthe    13 年前

    APC现在似乎可以缓存.inc文件和php,这确实大大提高了性能。

    推荐文章