ZF2针对高流量进行优化

时间:2013-02-02 23:22:16

标签: performance optimization zend-framework2

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

我用xdebug和webgrind配置我的代码,而我的函数似乎很慢 所以它必须是zf2中的最佳化问题。

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

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

我需要一些好的建议来增加高流量的响应。我说的是 30多个连接用户同时使用。

5 个答案:

答案 0 :(得分: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',
               ),
            );
        }
    }
    

    autoload_classmap.php则是'FQ-CLASSNAME' => 'FQ-FILEPATH'的简单数组。这可以很容易地自动using the classmap_generator-utility of ZF2

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

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

答案 1 :(得分:29)

如果您使用的是Doctrine,请不要忘记为注释添加缓存。这大大提高了性能(当我激活此缓存时,我将加载时间几乎除以2)。如果您使用的是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'
            )
        ),
    )
)

但是,开发时非常不方便,因为每当映射发生变化时都必须清除缓存。

答案 2 :(得分: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

答案 3 :(得分:3)

以上所有并使用某种操作码缓存(如APC / Opcache)它会加快速度。 但是,ZF 2似乎非常缓慢,甚至比ZF 1更慢:(

此外,模块配置缓存加快了速度,但是为了使其正常工作,你不能有任何关闭;)

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

答案 4 :(得分: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 + doctrine2 + zfcUser应用程序。 Memcached用于doctrine2目的,它只提供约5%的性能提升。 因此,使用ZendOp +,对于具有大量表单,实体,视图的复杂页面,简单页面增加了6倍(0.2 - > 0.03秒),增加了3倍(0.2 - 0.06)。如果我使用类图生成器,我将更新答案。

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