My ZF2 application seems to be extremely slow when more than 3 users are using it at the same time.
I profile my code with xdebug and webgrind and non of my functions seems to be slow so it has to be an optimalisation issue within the zf2 it's self.
For cache I make use of the EdpSuperluminal module by EvanDotPro, this seems to increase the performance of the application.
We make use of nginx reverse proxy but make no sense as well.
I need some good advices to increase the response for high traffic. I speak about 30+ connected user at the same time.
There's few very simple steps to achieve a faster application. There's three things that can always be considered.
ZF2 Performance QuickTipp #1 - ViewModels Always manually assign the fully qualified script to render. This will increase the performance a little. It's done like this:
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 This probably is one of the most important parts of speeding up your application. Personally i've seen an increase in LoadingTimes by up to 40%. Implementing this is pretty simple:
class Module
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
);
}
}
The autoload_classmap.php
then is a simple array of 'FQ-CLASSNAME' => 'FQ-FILEPATH'
. This can be automatted pretty easily using the classmap_generator-utility of ZF2
ZF2 Performance QuickTipp #3 - Keep Module.php light!
Sadly this is a post i haven't come around to write yet. The Module.php
is a file that is loaded on every single request. Lots of people forget about this and write lots and lots of factories inside them. At one point, ZfcUser-Module.php was an example of what not to do. Closures or anonymous functions are executed on every request, too. This is quite a bit of work to be done if there's too many of them over the whole project. A better approach would be to simply write Factory-Classes. ZfcUser later updated Module.php to use this strategy.
And that's pretty much all the easy stuff one can do (that i know of - i dont know much! :D). However what sounds interesting is that starting to use 3 users your application runs slow. To my experience this has nothing to do with the scripts itself but is rather an server issue. Is this from a Staging Machine or locally?
If you are using Doctrine, don't forget to add a cache for annotations. This drastically improve performance (when I activate this cache I divide nearly by two the loading time). If you are using 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'
)
),
)
)
However, it's quite inconvenient while developing because you must clear the cache whenever your mapping change.
the ZF2 classmap generator will give you a big boost if you have a large project:
http://framework.zend.com/manual/2.0/en/modules/zend.loader.classmap-generator.html
Alternatively if you are using composer (you should do) then you can use composer to generate the classmap for all your modules and dependdencies too which is even better:
php composer.phar install --optimize-autoloader
php composer.phar update --optimize-autoloader
All of the above and using some kind of opcode caching like APC / Opcache it will speed things up. But yes ZF 2 seems to be very slow unfortunately even more slow then ZF 1 :(
Also the module config cache speeds things up, you cannot have any closures though to make this working ;)
http://hounddog.github.io/blog/performance-in-zend-framework-2/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With