Symfony性能问题

4
我正在使用Symfony 2.8.12参与两个不同的项目,但都存在性能问题。页面加载时间过长(并非每次都是),当我查看分析器时,总有一个“罪魁祸首”:可能是防火墙、控制器、概要监听器、内核响应等,执行时间长达几秒钟(有时甚至超过10秒)。如下图所示: example case example case 2 在不同的讨论中,我尝试将数据库设置为固定IP地址(以防DNS查找问题),修改了php.ini中的一些参数,但没有改变。这在本地和远程环境中都发生,即使启用了PHP加速和OPCache。
我的代码没有做任何特殊处理,即使在“hello world”页面上也需要很长时间,这有点令人沮丧 :)

你是在Windows上运行它(以缓慢著称)吗?你读过https://dev59.com/m4Lba4cB1Zd3GeqPhad2?rq=1吗? - Veve
1
很难说清楚 - 你使用的是哪个操作系统,哪个PHP版本?你是以开发者模式还是生产环境运行Symfony?你是在内置的CLI PHP服务器上运行Symfony还是在实际的Web服务器(如Apache、Nginx)上运行?每次请求前都需要预热缓存吗?你的日志配置如何?是否启用了额外的调试功能? - LBA
1
谢谢大家,我忘了提到它是在Windows上运行的 :(,realpath_cache_size引起了问题! - yauros
@yauros - 在Windows上做的最好的事情就是安装带有Linux的虚拟机 :).但说真的,你还应该增加 realpath_cache_ttl 的值。同时看看我的文章,我鼓励你尝试使用元数据和查询结果缓存。你不仅可以使用apc进行缓存,还可以使用其他提供者,如memcached。 - Grzegorz Krauze
2个回答

15

这是因为Symfony在打印“Hello world”之前需要读取数千个文件。实际上,硬盘对Symfony的效率影响最大。幸运的是,有几个简单的步骤可以达到令人满意的水平。

  1. PHP.ini:
    将这两个参数设置为比默认值高得多的值,例如:
    realpath_cache_size = 4096k
    realpath_cache_ttl = 7200
  2. 转储composer自动加载:
    composer dump-autoload --optimize - 这将创建一个加载类的转储文件
  3. 我不知道您如何使用opcache,但我建议您安装apcu模块。之后,在Symfony的config_prod.yml中使用元数据缓存:
    doctrine:
    orm:
        metadata_cache_driver: apc
        result_cache_driver: apc
    
  4. 与常规代码相比,您的web/app.php应该具有一些额外的行:

    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\ClassLoader\ApcClassLoader;
    
    $loader = require __DIR__.'/../app/autoload.php';
    include_once __DIR__.'/../app/bootstrap.php.cache';
    
    $apcLoader = new ApcClassLoader(md5($_SERVER['HTTP_HOST']), $loader);
    $loader->unregister();
    $apcLoader->register(true);
    
    require_once __DIR__.'/../app/AppCache.php';
    $kernel = new AppKernel('prod', false);
    $kernel->loadClassCache();
    $kernel = new AppCache($kernel);
    Request::enableHttpMethodParameterOverride();
    $request = Request::createFromGlobals();
    $response = $kernel->handle($request);
    $response->send();
    $kernel->terminate($request, $response);
    

其他同样重要的内容:

  1. 使用PHP 7,这能显著提高效率。
  2. 使用带有FPM(FastCGI进程管理器)的PHP
  3. 使用NoSQL解决方案缓存查询,例如Redis、Elasticsearch
  4. 禁用xdebug – 确保分析器不显示您正在使用它。

实际上,这个列表还很长,但是前4点加上第8点在大多数常见情况下就可以解决问题。希望这能够帮到你。


如果我使用 metadata_cache_driver: apc 或标准的 php app/console cache:clear --env=prod --no-debug,我是否需要清除APC缓存? - StockBreak
如果在php.ini中提供了APCu,则每次更改PHP文件(或解析为PHP的TWIG)时都应该清除它。我使用这个工具来清除APC缓存:https://gordalina.github.io/cachetool/ - Grzegorz Krauze

3

您是否在php.ini中启用了xdebug扩展?

如果是这种情况,请尝试禁用它,特别是在生产环境中。


你好,感谢回答。本地和远程都已禁用。 - yauros
请查看此帖子,它可能会对您有所帮助:https://dev59.com/XmvXa4cB1Zd3GeqPFQwb#40618145 - progg
感谢所有人最终设置了 realpath_cache_size 值。现在看起来没问题了! - yauros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接