测试环境 ubuntu 14.04, php 5.5.9,使用 ab -c 10 -t 5 的方式针对不同的Symfony配置进行性能测试。
首先,symfony new test 3.0 命令行创建3.0版本的symfony
初始性能测试
Requests per second: 263.32 [#/sec] (mean)
Time per request: 37.977 [ms] (mean)
使用APC
Requests per second: 307.96 [#/sec] (mean)
Time per request: 32.472 [ms] (mean)
$loader = require __DIR__.'/../app/autoload.php';
include_once __DIR__.'/../var/bootstrap.php.cache';
$apcLoader = new Symfony\Component\ClassLoader\ApcClassLoader(sha1(__FILE__), $loader);
$loader->unregister();
$apcLoader->register(true);
在产线环境还可以对apc进行优化以提升性能,不过需要注意deploy后重启php-fpm
apc.stat=0
不使用twig,直接输出json
Requests per second: 372.09 [#/sec] (mean)
Time per request: 26.875 [ms] (mean)
use Symfony\Component\HttpFoundation\JsonResponse;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
return new JsonResponse(array('hello'=>'world'));
}
}
禁用monolog
如果你不需要在产线记录日志,或者你根本没有看过产线日志,那么禁用monolog也可以带来性能的提升。当然,使用redis log也是一个不错的选择。
Requests per second: 405.40 [#/sec] (mean)
Time per request: 24.667 [ms] (mean)
禁用SwiftMailer
对于需要经常发送邮件的应用而言,SwiftMailer是一个不错的选择,然而SwiftMailer会监听kernel.terminate事件来发送邮件,这样就是对于没有发送邮件需求的请求,使用SwiftMailer还会产生4-5ms的时间消耗,对于性能要求高的应用,这也是不可接受的。
并且,就算是需要发送邮件,对于一个高性能的应用,将邮件放在队列中发送比在kernel.terminate中发送要更加合理一些。
Requests per second: 506.43 [#/sec] (mean)
Time per request: 19.746 [ms] (mean)
以上就是暂时能够整理出来的Symfony性能最优化初始配置,当然,此配置只能做一些简单的restful应用。
在实际项目中,我们在创建新的service,添加新bundle时必须要关注其带来的性能影响,下面是一些常用的避免性能恶化的实践:
避免在service构造函数中做过多操作
特别是一些事件监听类服务,可能每次请求都会对该服务进行实例化操作,而实际上监听器只会在某些情况下才会进行真实的操作,因此那些消耗资源的初始化工作应该在真正用到前才进行。
使用doctrine cache,适当选择使用dql或者orm