Php Symfony 2性能问题
嗯,在我的网站上平均执行时间大约是5秒,这是很多。但奇怪的是,我的一条路由的执行时间超过30秒,并抛出错误!该网站已经在服务器上,因此我无法更改php.ini或添加任何加速器。在本地服务器上,速度大致相同 我在使用app_dev.php时没有使用分析器,但是app.php并没有让它更快 我使用的是ORM原则,执行30秒的路由包含一个具有10个左连接的查询。但是这些表只包含20k条记录,而且所有这些表都经过了很好的优化,所以Php Symfony 2性能问题,php,sql,symfony,Php,Sql,Symfony,嗯,在我的网站上平均执行时间大约是5秒,这是很多。但奇怪的是,我的一条路由的执行时间超过30秒,并抛出错误!该网站已经在服务器上,因此我无法更改php.ini或添加任何加速器。在本地服务器上,速度大致相同 我在使用app_dev.php时没有使用分析器,但是app.php并没有让它更快 我使用的是ORM原则,执行30秒的路由包含一个具有10个左连接的查询。但是这些表只包含20k条记录,而且所有这些表都经过了很好的优化,所以 我还使用knp分页器包。它不会使查询执行两次吗?首先,您不应该在生产机器
我还使用
knp分页器包
。它不会使查询执行两次吗?首先,您不应该在生产机器上使用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");
如果您想在另一个服务中使用stopwatch服务,只需将其注入即可。但是,秒表服务仅在调试模式下可用,因此您应该在服务定义中使用“on invalid”:
<service id=...>
<argument type="service" id="debug.stopwatch" on-invalid="null" />
</service>
在您的服务中,请确保在访问秒表服务之前已正确注入该服务。以下资源非常有用 Jordi关于绩效的建议之一是: 不要急于求成,先找出根本原因 虽然这是事实,您应该找出瓶颈并加以解决,但在将Symfony2应用程序部署到生产服务器时,有一些基本的事情可以帮助您提高性能(参见Symfony2文档):
--无调试
和--优化自动加载器
标志:
php composer.phar install --no-dev --optimize-autoloader
对于步骤4,使用--env=prod
和标志--no debug
:
php app/console cache:clear --env=prod --no-debug
除了基本部署过程外,您可能会发现启用条令元数据、查询和结果缓存是性能改进的一个来源:
# app/config/config_prod.yml
doctrine:
orm:
metadata_cache_driver: apc
result_cache_driver: apc
query_cache_driver: apc
有关更多信息,请参见和
另一方面,对我来说,一个有10个左连接的查询听起来像是一面红旗。我将检查代码的逻辑以及在您的应用程序中是否需要这样的查询
作为最后的建议(这超出了问题的答案),请使用最新版本的PHP。在我们从PHP5.3.10更新到PHP5.5.9之后,我们的应用程序的加载时间减少了一半
祝你好运
额外资源:
无法更改php.ini或添加任何加速器
您是否使用共享主机?您可以执行诸如composer或symfony命令之类的命令吗?对于缓存,您不需要使用APC,这只是一个驱动程序,您可以设置memcached服务器并将其用作缓存系统。强烈建议您安装APC或类似的加速器,因为它将提高应用程序的性能(除非您运行的是包含Zend OPCache的PHP5.5)。