blanchonvincent/zf2-lazy-loading-module

ZF2 Lazy Loading Module 1.5.2 - 为ZF2提供实现懒加载模块的库

此包的规范存储库似乎已丢失,因此该包已被冻结。

1.5.2 2013-02-24 19:31 UTC

This package is not auto-updated.

Last update: 2019-04-29 00:36:23 UTC


README

版本 1.5.2 由 Vincent Blanchon 创建

简介

对于这个项目,我重新定义了模块管理器的一部分,以实现懒加载并提高性能。项目示例可在懒加载模块网站找到

安装

  1. 使用composer安装

在composer.json中添加依赖项

{
    "require" : {
        "blanchonvincent/zf2-lazy-loading-module" : "master-dev"
    }
}
php composer.phar update
  1. 修改./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',
        ),
    ),
));
  1. 修改./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模块的概念只能加载当前环境授权的模块。例如

  1. 我想只在端口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',
        ),
    ),
);
?>
  1. 我想只在"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%以上的性能!