关于drupal hook(钩子机制) 和 performance(性能)的讨论

Submitted by admin on Mon, 03/11/2013 - 09:27

http://groups.drupal.org/node/285633
drupal groups上的一个问题,必须要回答。同时这也是曾经困扰我的问题。花了一个多小时做整理和解析。同时也在自己的博客记录下,以备更多人能够少被这个问题困扰。
原文链接:
http://groups.drupal.org/node/285633#comment-898648

这是一个老生常谈的问题。

hook机制是drupal最具吸引力的特性。 Hook机制赋予drupal强大的灵活性和扩展性。
如果要使用drupal做开发,hook是必须要跨过去的一道坎。

因为hook对drupal如此重要,当然会对hook有优化的方案。那就是drupal的cache(缓存)机制。
在大多数情况下,hook是通过module_implements这个函数来执行的,以下是函数原型:
function module_implements()
可以看到,在默认的情况下,drupal会对hook做缓存,那么将来执行hook的时候,缓存机制会有效的提高性能。

(PS: drupal 有几个特殊的hook,比如hook_init, hook_exit, hook_cron等是通过module_invoke_all来
执行的, module_invoke_all函数原型如下:
function module_invoke_all()
这些hook,没有使用drupal的缓存机制,因此编写代码的时候,需要注意。)

相比较而言,hook机制对drupal灵活性和扩展性上带来的优势,会大于其对性能的影响所带来的劣势;
综合考虑,hook造成的性能的损耗,通过缓存系统得到巧妙的弥补,从而在性能和扩展方面得到良好的平衡。
因此hook机制得以保留。