You are here

7.2插件方式的好处

admin 的头像
Submitted by admin on 星期一, 2015-09-21 04:15

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

插件的方式,就能很好的解决这个缓加载的问题,Drupal在默认的情况下,是不会去加载插件的,只有当需要的时候,才去加载相应的插件。在field validation 1.x里面,我们也拆分成了多个文件,比如field_validation.validators.incfield_validation.rules.inc,我们把所有的验证器都放到了field_validation.validators.inc中,很多人以为,这样也实现了缓加载,其实不然,在field_validation.module文件里面,代码是这样写的:

include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'field_validation') . '/' . 'field_validation.validators.inc';

include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'field_validation') . '/' . 'field_validation.rules.inc';

这意味着在加载field_validation.module文件的同时,会自动加载field_validation.validators.incfield_validation.rules.inc两个文件。这种方式是没有实现缓加载的,不信的话,你可以测试一下,新写一个模块,在里面直接调用field_validation.validators.incfield_validation.rules.inc文件里面的方法,此时是可以直接调用的,这意味着这两个文件也被加载了进来。

我们大致算一下,在1.x版本里面,普通页面请求过来以后,field validation加载到内存里面的文件大小有:

12 Kfield_validation.module) + 2k field_validation.rules.inc+ 30K field_validation.validators.inc= 44K

而在2.x里面,禁用了field_validation_ui模块以后,总共加载到内存里面的大小:

3 Kfield_validation.module) = 3K

如果算上field_validation_ui模块,加载到内存里面的大小:

3 Kfield_validation.module+ 7Kfield_validation_ui.module = 10K

在这两种情况下,分别少加载了41K34K大小的文件到内存中去。这就是field validation2.X对 1.X版本的一个重要改进。

那么在调用一个验证器的情况下,又会加载多少文件大小内,显然在field validation1.X下面,加载的大小仍然为44K,而在2.x里面,禁用了field_validation_ui模块以后,总共加载到内存里面的大小:

3 Kfield_validation.module+ 3Kfield_validation_numeric2_validator.inc) = 6K

验证器的文件大小不一样,3K取一个大致的平均数,此时也只有6K大小。如果算上field_validation_uimodule文件,也只有13K大小。

在调用验证器的情况,我们仍然节省了38K31K大小的内存。总之,我们对性能的改进,是有所帮助的。

 

在维护1.x版本的时候,每当我坐一个小小的修改时,生怕改动了其它验证器,而在2.x里面,一个验证器,一个文件,管理起来非常方便,我修改这个验证器,肯定影响不到其它的验证器,至少不用提心吊胆了。采用插件的形式,更好理解,其他程序员学习的成本更低了,他只需要复制一个插件,重命名,改一下里面关键的验证逻辑,然后将修改后的验证器,放到field_validation\plugins\validator目录下面,就可以正常工作了,这样的好处,就是不用修改已有的文件。以前加一个验证器的时候,总要修改field_validation.validators.inc文件,现在只需要创建一个自己独立的文件就可以了。

插件的方式,比钩子的方式,要灵活很多,是钩子方式的一种进步。在我实现了2.0-beta1以后,我有了更多的关于插件的想法,比如核心里面区块,其实也可以转换为插件;比如Ubercart里面的支付方法、运送方法、窗格,也都可以转换为插件的形式,这就是uc_ctools的由来。


Drupal版本: