首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony 2性能问题

Symfony 2性能问题
EN

Stack Overflow用户
提问于 2014-08-02 00:06:25
回答 2查看 591关注 0票数 0

嗯,我的网站上的平均执行时间大约是5秒,这是很多的。但奇怪的是,我的其中一个路由的执行时间超过了30秒,并抛出了错误!该网站已在服务器上,因此我无法更改php.ini或添加任何加速器。在本地服务器上,速度大致相同。

我正在使用没有分析器的app_dev.php,但是app.php并没有让它更快。

我使用的是doctrine,执行30秒的路由包含一个查询,其中有大约10个左连接。但是这些表只包含大约20k条记录,而且所有这些表都经过了很好的优化,所以...

我也使用knp-paginator-bundle。它不会使查询执行两次吗?

EN

回答 2

Stack Overflow用户

发布于 2014-08-02 03:02:12

下面的资源是非常有用的High Performance Websites with Symfony2

乔迪关于性能的建议之一是:

不要着急,先找出根本原因

虽然这是真的,但您应该找出瓶颈并解决它们,当您将Symfony2应用程序部署到生产服务器时,您应该做一些基本的事情来帮助您提高性能(形成Symfony2 documentation How to Deploy a Symfony2 Application):

将修改后的代码上载到实时server;

  • Update您的供应商依赖项(通常通过Composer完成,并且可能在uploading);

  • Running数据库迁移或类似任务之前完成,以更新任何更改的data structures;

  • Clearing (可能更重要的是预热)您的缓存。

对于步骤2,请确保使用--no-debug--optimize-autoloader标志:

代码语言:javascript
复制
php composer.phar install --no-dev --optimize-autoloader

对于步骤4,使用--env=prod和标志--no-debug

代码语言:javascript
复制
php app/console cache:clear --env=prod --no-debug

除了基本部署过程之外,您可能会发现启用规则元数据、查询和结果缓存是性能改进的来源:

代码语言:javascript
复制
# app/config/config_prod.yml
doctrine:
    orm:
        metadata_cache_driver: apc
        result_cache_driver:   apc
        query_cache_driver:    apc

有关更多信息,请参见Doctrine CacheImprove Doctrine performance up to 100% on your Symfony2 projectDoctrineBundle Configuration (Caching Drivers)

在另一个注释中,有10个左连接的查询对我来说听起来像是一个危险信号。我会检查代码的逻辑以及在您的应用程序中是否需要这样的查询。

作为最后的建议(这超出了问题的答案),请使用最新版本的PHP。在我们从PHP 5.3.10更新到PHP 5.5.9之后,我们的应用程序的加载时间减少了一半。

祝好运!

其他资源:

票数 1
EN

Stack Overflow用户

发布于 2014-08-02 00:56:38

首先,您不应该在生产机器上使用app_dev.php。默认情况下,它在启用调试的情况下启动内核,为潜在攻击者提供有关您的系统的有用信息。

关于您的性能问题:在本地计算机上安装xdebug,并在Symfony2中启用分析器。如果您的脚本遇到超时,请增加php.ini中的执行时间。

探查器中的时间线应该为您提供有关应用程序中潜在时间接收器的有用信息。

如果你需要更详细的计时,你可以在你的控制器或服务中使用秒表服务来测量你想要的任何东西。

在控制器内部,它看起来像这样:

代码语言:javascript
复制
$stopwatch = $this->get('debug.stopwatch');
$stopwatch->start("someEvent");
// Here is the code you want to measure
$stopwatch->stop("someEvent");

如果你想在另一个服务中使用秒表服务,你可以简单的注入它。但是,秒表服务仅在调试模式下可用,因此您应该在服务定义中使用"on-invalid“:

代码语言:javascript
复制
<service id=...>
     <argument type="service" id="debug.stopwatch" on-invalid="null" />
</service>

在你的服务内部,确保秒表服务在访问它之前被正确地注入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25084329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档