【问题标题】:ZF2 Optimize for high trafficZF2 针对高流量进行优化
【发布时间】:2013-01-18 00:34:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 3 个同时用户,远非高流量。而且您必须已经优化。这很糟糕。

标签: performance optimization zend-framework2


【解决方案1】:

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

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

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

【讨论】:

  • 感谢山姆的评论。我已经使用了所有这些解决方案:) 我使用 php 服务器端文件缓存 aswel。并不是说应用程序有 3 个访问者很慢,而是它是失去性能的“起点”。如果有 30 个活跃访问者,则加载页面的响应时间最长可达 8 秒。我们可以排除服务器问题。我们在性能上做了很多。在同一个应用程序在一些原始(脏)php 上运行之前,速度很快,即使有 30 多个活跃访问者。
  • 8s,哇。这确实是您直接脚本中的内容。因为使用 50 个活跃用户运行 Skeleton 对我没有任何问题。所以这将是您脚本中的最终用户内容,但要调试它,我们会知道那里出了什么问题:S 在我的最后,它一直是数据库连接:)
  • 你用什么来调试你的代码?我分析了我的代码并使用 webgrind 分析了缓存输出。我找不到自己的慢功能:/ ...目前,页面加载需要 15 秒,服务器加载 25.00。 CPU 100% (2 GHz) 一点都不好。 ;(
  • Xdebug 和 WinCacheGrind,所以基本上和你一样。我注意到,在整理 Zend 代码时,瓶颈在 DB\Adapter 类 __construct 内部 - 所以是 db 连接。这种长度的页面加载肯定会在您的某些功能之间的加载时间上有很大的跳跃。因此,研究必须揭示一些东西,但我自己不是一个经验丰富的调试器,对不起
  • 今天我用 2GHz(额外核心)升级了我们的 Web 服务器,这似乎确实给应用程序带来了提升。 php解析时间,100ms左右,流量不错。结论; Zend Framework 要求您的 Web 服务器有更高的性能(这很符合逻辑,因为它仍然是一个框架)。
【解决方案2】:

如果您使用 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'
            )
        ),
    )
)

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

【讨论】:

  • 我不知道是谁投了反对票。这是一个很好的答案。教义;如果你不使用它,你应该使用它,但它确实会导致没有缓存的减速。
  • +1,部署缓存!我有适当的 config/autoload/local..php.dist 文件,我可以根据环境交换这些文件,每个文件都会覆盖 config/autoload/global.php 中的默认值,从而解决了开发问题。
  • 我尝试使用该配置,但没有成功。花了几个小时后,我解决了这个问题,我发现这个答案已经过时了。 @michael-gallengo 你能更新一下吗?
【解决方案3】:

如果您有一个大型项目,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

【讨论】:

  • 同意; composer 通常会是一种更好的方法,因为您可能无论如何都在使用它(无论如何安装 ZF2 组件的最佳方式)并且您希望它自动加载您的所有 composer 库......所以您可能只拥有一个自动装载机。
【解决方案4】:

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

此外,模块配置缓存加快了速度,但您不能使用任何闭包来使其正常工作;)

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

【讨论】:

    【解决方案5】:

    首先要加速您的 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。节省服务器资源。

    【讨论】:

    • ZendOptimizerPlus 是否适用于 Zend 1 或 2 或两者?
    • @Gizzmo 我在 Zend 中都使用过
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2012-07-16
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    相关资源
    最近更新 更多