Symfony开发环境下缓存清除(cache:clear)异常缓慢

6
我最近几个月一直在本地环境中遇到问题,即cache:clear命令非常缓慢。很多时候需要超过一分钟的时间。我尝试了使用XAMPP和WAMP进行操作,但都没有帮助。我试图通过删除不同的服务和bundles来解决问题,但情况仍然如此。
最后我发现问题与我在Resources/Views文件夹中拥有的Twig文件数量成正比。我甚至创建了一个新的Symfony项目,并使用标准命令创建了一个简单的标准控制器和twig文件来检查我的假设。我在Resources/Views文件夹中添加的Twig文件越多,cache:clear命令就越慢(大致成比例)。是否有一种方法可以防止这种情况发生,因为我们的项目中有大量的Twig文件在我们的Resources文件夹中。
我正在使用:
Windows 10 PHP 7.0.15 Symfony 2.7.23 Twig 1.31.0
任何帮助将不胜感激 :)

命令行上是否启用了Xdebug? - A.L
你是否已禁用了你的防病毒软件或为你的网站开发目录添加了例外? - Will B.
4个回答

8

我在cli环境下启用xdebug时遇到了类似的问题。Twig解析需要对模板文件进行多次迭代,因此xdebug对twig缓存生成性能有很大影响。

尝试在您的php cli配置中注释掉这行:

;zend_extension=xdebug.so

谢谢Paul Andrieux,我已经这样做了,但没有显著的帮助。 - W.Ahmed

5

我在Windows 10上提高性能的一些方法,同时保持xdebug。

启用opcache

禁用xdebug.remote_autostart

添加x-debug辅助扩展

提示:如果你有带有remote_autostart 1的xdebug扩展,即使没有任何断点,你也应该始终保持IDE中的监听器开启,否则所有东西都会运行得非常慢(参见第6个案例)。

使用小型Symfony 4.2项目进行一些测试,处于开发模式下,时间是从Chrome获取的DomContentLoaded

  1. xdebug已开启,remote_autostart为0,IDE监听器已开启,调试未启用chrome扩展程序:
    • 无缓存:9.5秒
    • 缓存后:580-620ms
  2. xdebug已开启,remote_autostart为0,IDE监听器已开启,调试已启用chrome扩展程序:
    • 无缓存:16.35秒
    • 缓存后:950ms-1s
  3. xdebug已开启,remote_autostart为0,IDE监听器已关闭,调试未启用chrome扩展程序:
    • 无缓存:9.02秒
    • 缓存后:565-650ms
  4. xdebug已开启,remote_autostart为0,IDE监听器已关闭,调试已启用chrome扩展程序:
    • 无缓存:13.99秒
    • 缓存后:5.54秒
  5. xdebug已开启,remote_autostart为1,IDE监听器已开启:
    • 无缓存:14.92秒
    • 缓存后:1.02秒
  6. xdebug已开启,remote_autostart为1,IDE监听器已关闭:
    • 无缓存:14.92秒
    • 缓存后:5.69秒
  7. xdebug已关闭:
    • 无缓存:6.66秒
    • 缓存后:483-525ms

通常我使用第一种情况,当我需要调试时,我切换到第二种情况。第3、4、5、6个案例适用于那些可能不了解IDE监听器和调试cookie影响的人。

更新

我使用启用了Windows子系统的Linux(WSL)进行了相同项目的测试,并获得了一些改进。当没有缓存时,加载时间大约为:

  • 启用了xdebug但监听器未开启的情况下为6.5秒
  • 启用了xdebug且监听器已开启的情况下为9.5秒
  • 禁用了xdebug的情况下仅需2.5秒!

总的来说,WSL使一切都变得更好,将加载时间降低了50%。

注意:要让WSL正常工作,您需要禁用Windows Defender实时保护,否则使用WSL会比不使用WSL慢2倍。可能有一些选项可以让实时保护开启并排除WSL,但我目前不知道。


由于WSL已经发生了变化并且可能会继续变化,为了避免与WSL相关的许多细节问题,我建议使用Docker或Vagrant安装。使用VirtualBox和您选择的Linux发行版(Fedora、Debian、RHEL、CentOS等),这将为您提供一个干净的Linux环境,可以轻松地克隆到另一个系统中。 - Will B.

2
我的cache:clear速度得到了很大的改善,方法是关闭调试器:xdebug.profiler_enable = off。我使用的是Windows上的WAMP,PHP版本为7.1和7.2。在WAMP(不仅仅是它)中,本地Web主机和控制台可能没有使用相同的php.ini文件。如果你检查浏览器中phpinfo()输出,你可能会发现调试器已经关闭了。但是,当你在控制台运行cache:clear时,控制台可能没有使用相同的php.ini文件,这也是我的情况。实际使用的php.ini文件来自控制台,其中调试器正在运行,这导致PHP在后台创建了许多GB的cachegrind文件,而我并不知道。只有当我检查资源管理器的HDD使用情况时,才注意到这一点,同时cache:clear正在进行。最终关闭调试器后,cache:clear至少快了5倍。

-3
一个Symfony核心开发者问我他总是执行rm -fr var/cache/*,所以在运行应用程序之前,我也总是这样做。
此外,在config_dev.yml中将模板缓存设置为false。
twig:
    cache:false

谢谢Shahroze Nawaz,我已经完成了这个,但是它并没有改善当前的情况。 - W.Ahmed

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