当超过3个用户同时使用它时,我的ZF2应用程序似乎非常慢。
我用xdebug和webgrind配置我的代码,而我的函数似乎很慢 所以它必须是zf2中的最佳化问题。
对于缓存我使用EvanDotPro的EdpSuperluminal模块,这似乎提高了应用程序的性能。
我们使用nginx反向代理,但也没有意义。
我需要一些好的建议来增加高流量的响应。我说的是 30多个连接用户同时使用。
答案 0 :(得分:43)
实现更快的应用程序的步骤很简单。总有三件事情可以考虑。
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
));
}
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
ZF2 Performance QuickTipp#3 - 保持Module.php轻盈!
可悲的是,这是一篇我还没有写过的帖子。 Module.php
是在每个请求上加载的文件。很多人都忘掉了这一点,并在里面写了很多很多工厂。有一次,ZfcUser-Module.php是不该做的事情的一个例子。每个请求也会执行闭包或匿名函数。如果在整个项目中有太多的工作要做,这是相当多的工作要做。更好的方法是简单地编写 Factory-Classes 。 ZfcUser稍后updated Module.php使用此策略。
这就是人们可以做的所有简单的事情(我知道 - 我不太了解!: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 +模块。它节省了服务器资源。