31

当超过 3 个用户同时使用我的 ZF2 应用程序时,它似乎非常慢。

我用 xdebug 和 webgrind 分析我的代码,我的函数中的非函数似乎很慢,所以它必须是 zf2 中的一个优化问题。

对于缓存,我使用了 EvanDotPro 的 EdpSuperluminal 模块,这似乎提高了应用程序的性能。

我们使用 nginx 反向代理,但也没有任何意义。

我需要一些好的建议来增加对高流量的响应。我同时谈论大约 30 多个连接用户。

4

5 回答 5

43

有几个非常简单的步骤可以实现更快的应用程序。总是可以考虑三件事。

  1. ZF2 Performance QuickTipp #1 - ViewModels 始终手动分配完全限定的脚本以进行渲染。这将稍微提高性能。它是这样完成的:

    public function someAction()
    {
        $viewModel = new ViewModel();
        $viewModel->setTemplate('MODULE / CONTROLLER / ACTION.phtml');
        // In this given example: $viewModel->setTemplate('foo/bar/some.phtml');
    
        // Do some other Controller-logic as used to
    
        return $viewModel->setVariables(array(
            //key-value-paired view-variables
        ));
    }
    
  2. ZF2 Performance QuickTipp #2 - Classmap Autoloading 这可能是加快应用程序速度的最重要部分之一。就我个人而言,我看到加载时间增加了高达 40%。实现这一点非常简单:

    class Module 
    {
        public function getAutoloaderConfig()
        {
            return array(
               'Zend\Loader\ClassMapAutoloader' => array(
                    __DIR__ . '/autoload_classmap.php',
               ),
            );
        }
    }
    

    then 是一个简单的autoload_classmap.php数组'FQ-CLASSNAME' => 'FQ-FILEPATH'。这可以很容易地使用 ZF2 的 classmap_generator-utility 自动化

  3. ZF2 Performance QuickTipp #3 - 保持 Module.php 轻巧!可悲的是,这是一篇我还没来得及写的帖子。这Module.php是一个在每个请求上加载的文件。很多人忘记了这一点,在里面写了很多很多的工厂。在某一时刻,ZfcUser-Module.php是一个不该做的例子。闭包或匿名函数也会在每个请求上执行。如果整个项目中有太多的人,这是相当多的工作要做。更好的方法是简单地编写Factory-Classes。ZfcUser 后来更新了 Module.php来使用这个策略。

这几乎是一个人可以做的所有简单的事情(我知道 - 我知道的不多!:D)。然而,有趣的是,开始使用 3 个用户时,您的应用程序运行缓慢。根据我的经验,这与脚本本身无关,而是服务器问题。这是来自登台机器还是本地?

于 2013-02-03T12:28:09.670 回答
29

如果您使用 Doctrine,请不要忘记为注释添加缓存。这极大地提高了性能(当我激活这个缓存时,我几乎将加载时间除以二)。如果你使用 DoctrineORMModule:

'doctrine' => array(
    'driver' => array(

        'cache' => array(
            'class' => 'Doctrine\Common\Cache\ApcCache'
        ),

        'configuration' => array(
            'orm_default' => array(
                'metadata_cache' => 'apc',
                'query_cache'    => 'apc',
                'result_cache'   => 'apc'
            )
        ),
    )
)

但是,在开发过程中非常不方便,因为您必须在映射更改时清除缓存。

于 2013-05-11T18:42:32.367 回答
27

如果您有一个大型项目,ZF2 类映射生成器将为您提供很大的帮助:

http://framework.zend.com/manual/2.0/en/modules/zend.loader.classmap-generator.html

或者,如果您正在使用 composer(您应该这样做),那么您也可以使用 composer 为您的所有模块和依赖项生成类映射,这样会更好:

php composer.phar install --optimize-autoloader

php composer.phar update --optimize-autoloader
于 2013-02-08T16:25:47.167 回答
3

以上所有内容并使用某种操作码缓存(如 APC / Opcache)将加快速度。但是是的,ZF 2 似乎很慢,不幸的是比 ZF 1 更慢 :(

模块配置缓存也加快了速度,但你不能有任何闭包来使它工作;)

http://hounddog.github.io/blog/performance-in-zend-framework-2/

于 2013-08-05T19:01:20.740 回答
2

首先要加速您的 zf2 应用程序,您应该使用ZendOptimizerPlus。大部分执行时间用于读取和预编译 php 代码。典型的 ZF2 应用程序有很多文件,因此处理它们需要很长时间。

ZendOp+ 将您的 php 应用程序的字节码保存在共享内存中,因此服务器不会读取大量文件,也不会在每个请求中解析它。ZendOp+ 将默认为 php5.5,因此了解它并使用它很有用。

基准测试使简单框架应用程序的性能提高了 9 倍(symfony2 测试 - http://www.ricardclau.com/2013/03/apc-vs-zend-optimizer-benchmarks-with-symfony2/)。

我将它用于我的 zf2 + 学说 2 + zfcUser 应用程序。Memcached 用于学说 2 的目的,它只提供大约 5% 的性能提升。因此,使用 ZendOp+,简单页面增加了 6 倍(0.2 -> 0.03 秒),具有大量表单、实体和视图的复杂页面增加了 3 倍(0.2 - 0.06)。如果我使用类图生成器,我会更新答案。

另一个问题是使用 nginx + php-fpm 而不是 apache2+module。它节省了服务器资源。

于 2014-04-17T21:12:38.747 回答