好吧,我网站上的平均执行时间大约是5秒,这很多。但奇怪的是,我的一条路线的执行时间超过30秒并抛出错误!该网站已经在服务器上,因此我无法更改php.ini或添加任何加速器。在本地服务器上,速度大致相同。
我在没有探查器的情况下使用app_dev.php,但是app.php并没有更快地使用它。
我使用了doctrine ORM,执行30秒的路由包含一个带有~10个左连接的查询。但是这些表只包含20k记录,所有这些表都经过了很好的优化,所以......
我也使用knp-paginator-bundle
。它不会使查询执行两次吗?
答案 0 :(得分:1)
以下资源非常有用High Performance Websites with Symfony2。
Jordi关于表现的建议之一是:
不要急于找出根本原因
虽然这是真的,你应该找出瓶颈并解决它们,但是在将Symfony2应用程序部署到生产服务器时应该做一些基本的事情来帮助你提高性能(形成Symfony2文档How to Deploy a Symfony2 Application):
- 将修改后的代码上传到实时服务器;
- 更新您的供应商依赖关系(通常通过Composer完成,可以在上传之前完成);
- 运行数据库迁移或类似任务以更新任何已更改的数据结构;
- 清理(也许更重要的是,预热)缓存。
醇>
对于第2步,请确保使用--no-debug
和--optimize-autoloader
标记:
php composer.phar install --no-dev --optimize-autoloader
对于第4步,请使用--env=prod
和标记--no-debug
:
php app/console cache:clear --env=prod --no-debug
除基本部署过程外,您可能会发现启用doctrine元数据,查询和结果缓存是性能改进的来源:
# app/config/config_prod.yml
doctrine:
orm:
metadata_cache_driver: apc
result_cache_driver: apc
query_cache_driver: apc
有关其他信息,请参阅Doctrine Cache,Improve Doctrine performance up to 100% on your Symfony2 project和DoctrineBundle Configuration (Caching Drivers)。
在另一个注释中,一个带有10个左连接的查询听起来像是一个红旗。我会检查代码的逻辑以及在您的应用程序中需要这样的查询。
作为最后的建议(这不是问题的答案),请使用最新版本的PHP。我们从PHP 5.3.10更新到PHP 5.5.9加载时间,我们的应用程序减少了一半。
祝你好运!其他资源:
答案 1 :(得分:0)
首先,您不应该在生产计算机上使用app_dev.php。默认情况下,它启动内核并启用调试,为潜在的攻击者提供有关系统的有用信息。
关于性能问题:在本地计算机上安装xdebug,并在Symfony2中启用探查器。如果您的脚本遇到超时,请增加php.ini中的执行时间。
探查器中的时间轴应该为您提供有关应用程序中潜在时间接收器的有用信息。
如果您需要更详细的时间安排,您可以使用控制器或服务中的秒表服务并测量您想要的任何内容。
在控制器内部,它看起来像这样:
$stopwatch = $this->get('debug.stopwatch');
$stopwatch->start("someEvent");
// Here is the code you want to measure
$stopwatch->stop("someEvent");
如果您想在其他服务中使用秒表服务,您只需注入即可。但是,秒表服务仅在调试模式下可用,因此您应该使用" on-invalid"在您的服务定义中:
<service id=...>
<argument type="service" id="debug.stopwatch" on-invalid="null" />
</service>
在您的服务中,确保在访问秒表服务之前已正确注入秒表服务。