blanchonvincent / zf2-lazy-loading-module
ZF2 Lazy Loading Module 1.5.2 - 为ZF2提供实现懒加载模块的库
此包的规范存储库似乎已丢失,因此该包已被冻结。
1.5.2
2013-02-24 19:31 UTC
Requires
- php: >=5.3.3
- zendframework/zendframework: 2.*
This package is not auto-updated.
Last update: 2019-04-29 00:36:23 UTC
README
版本 1.5.2 由 Vincent Blanchon 创建
简介
对于这个项目,我重新定义了模块管理器的一部分,以实现懒加载并提高性能。项目示例可在懒加载模块网站找到
安装
- 使用composer安装
在composer.json中添加依赖项
{
"require" : {
"blanchonvincent/zf2-lazy-loading-module" : "master-dev"
}
}
php composer.phar update
- 修改./init_autoloader.php
<?php require_once __DIR__ . '/vendor/ZF2/library/Zend/Loader/AutoloaderFactory.php'; // Composer autoloading if (file_exists('vendor/autoload.php')) { $loader = include 'vendor/autoload.php'; } Zend\Loader\AutoloaderFactory::factory(array( 'Zend\Loader\StandardAutoloader' => array( 'autoregister_zf' => true, 'namespaces' => array( 'ZFMLL' => __DIR__ . '/vendor/blanchonvincent/zf2-lazy-loading-module', ), ), ));
- 修改./config/application.config.php
<?php return array( 'modules' => array( // your modules ), 'module_listener_options' => array( 'module_paths' => array( './module', './vendor', ), 'config_glob_paths' => array( 'config/autoload/{,*.}{global,local}.php', ), 'lazy_loading' => array( // define here your rules ), ), 'service_manager' => array( 'factories' => array( 'ModuleManager' => 'ZFMLL\Mvc\Service\ModuleManagerFactory', ), ), );
Lazy Loading模块使用方法
Lazy loading模块的概念只能加载当前环境授权的模块。例如
- 我想只在端口443上加载我的"Administration"模块,并且如果我的客户端IP有效。否则,加载此模块是无用的。
使用config/application.config.php仅在端口443和IP白名单上加载模块的配置
<?php return array( 'modules' => array( 'Application', 'Cron', 'Administration', 'Blog', ), 'module_listener_options' => array( 'config_glob_paths' => array( 'config/autoload/{,*.}{global,local}.php', ), 'config_cache_enabled' => false, 'cache_dir' => 'data/cache', 'module_paths' => array( 'Application' => './module/Application', 'Cron' => './module/Cron', 'Administration' => './module/Administration', 'Blog' => './module/Blog', ), 'lazy_loading' => array( 'Administration' => array( 'port' => '443', 'remote_addr' => array('127.0.0.1'), ), ), ), 'service_manager' => array( 'factories' => array( 'ModuleManager' => 'ZFMLL\Mvc\Service\ModuleManagerFactory', ), ), ); ?>
- 我想只在"cli" sapi中加载我的"Cron"模块,并运行包含在参数中的URL
<?php return array( 'modules' => array( 'Application', 'Cron', 'Administration', 'Blog', ), 'module_listener_options' => array( 'config_glob_paths' => array( 'config/autoload/{,*.}{global,local}.php', ), 'config_cache_enabled' => false, 'cache_dir' => 'data/cache', 'module_paths' => array( 'Application' => './module/Application', 'Cron' => './module/Cron', 'Administration' => './module/Administration', 'Blog' => './module/Blog', ), 'lazy_loading' => array( 'Cron' => array( 'getopt' => array('cron=s' => 'cron url'), 'sapi' => 'cli', ), ), ), 'service_manager' => array( 'factories' => array( 'ModuleManager' => 'ZFMLL\Mvc\Service\ModuleManagerFactory', ), ), ); ?>
过滤器包括:命令行参数、sapi、域名、HTTPS协议、服务器端口、URL和远程地址。
缓存密钥将自动更新为已加载的模块。
基准测试
基准测试条件
- 未启用模块缓存
- 每个测试加载100个模块
- 主页动作
- 最新的master分支版本(截至5月1日)
在第一种情况下
- 4个模块:Application、Administration、Cron和Blog
- 在每个其他Application模块中,有一个简单的类(如项目代码中所示)
<?php class Module implements AutoloaderProvider { public function init(Manager $moduleManager) { } public function getAutoloaderConfig() { return array( 'Zend\Loader\ClassMapAutoloader' => array( __DIR__ . '/autoload_classmap.php', ), ); } public function getConfig() { return include __DIR__ . '/config/module.config.php'; } }
=> ZFMLL在模块加载上性能提高高达5%。
在第二种情况下
- 4个模块:Application、Administration、Cron和Blog
- Cron & Blog具有最小的类Module,而Administration附加了三个监听器(监听器函数为空)
<?php $events = $manager->events()->getSharedManager(); $events->attach('application', MvcEvent::EVENT_BOOTSTRAP, array($this, 'firstListener'), 100); $events->attach('application', MvcEvent::EVENT_BOOTSTRAP, array($this, 'secondListener'), 100); $events->attach('Zend\ModuleManager\ModuleManager', 'loadModules.post', array($this, 'thirdListener'), -100);
=> ZFMLL在模块加载上性能提高**高达55%**。
在第三种情况下
- 4个模块:Application、Administration、Cron和Blog
- Administration附加了与第二种情况相同的监听器,而Blog附加了两个监听器(监听器函数为空)
<?php $events = $manager->events()->getSharedManager(); $events->attach('application', MvcEvent::EVENT_BOOTSTRAP, array($this, 'firstListener'), 100); $events->attach('application', MvcEvent::EVENT_BOOTSTRAP, array($this, 'secondListener'), 100);
=> ZFMLL在模块加载上性能提高高达60%。
在几个监听器中包含真实代码时,ZFMLL可以在模块加载上提高75%以上的性能!