繁体   English   中英

Laravel真的这么慢吗?

[英]Is Laravel really this slow?

我刚开始使用 Laravel。我几乎没有编写任何代码,但我的页面加载时间将近一秒钟!

laravel 计时

当我的无框架应用程序和 NodeJS 应用程序需要大约 2 毫秒时,这让我感到有点震惊。 Laravel 在做什么? 这不是正常行为吗? 它需要一些微调吗?

Laravel 实际上并没有那么慢。 500-1000ms 是荒谬的; 我在调试模式下将其缩短到 20 毫秒。

问题是 Vagrant/VirtualBox + 共享文件夹。 我没有意识到他们的表现受到了如此大的打击。 我猜是因为 Laravel 有很多依赖项(加载约 280 个文件)并且每个文件读取都很慢,所以它加起来真的很快。

kreeves 为我指明了正确的方向, 这篇博文描述了 Vagrant 1.5 中的一项新功能,它可以让您将文件同步到虚拟机中,而不是使用共享文件夹。

Windows 上没有本机 rsync 客户端,因此您必须使用cygwin 安装它,并确保勾选 Net/rsync。 C:\\cygwin64\\bin添加到您的路径中。 【或者你也可以在Win10/Bash上安装】

Vagrant 介绍了新功能 我正在使用 Puphet,所以我的 Vagrantfile 看起来有点滑稽。 我不得不调整它看起来像这样:

  data['vm']['synced_folder'].each do |i, folder|
    if folder['source'] != '' && folder['target'] != '' && folder['id'] != ''
      config.vm.synced_folder "#{folder['source']}", "#{folder['target']}", 
        id: "#{folder['id']}", 
        type: "rsync",
        rsync__auto: "true",
        rsync__exclude: ".hg/"
    end
  end

设置完成后,请尝试vagrant up 如果一切顺利,您的机器应该会启动并复制所有文件。 您需要在终端中运行vagrant rsync-auto以使文件保持最新。 您会在延迟上付出一点代价,但是对于 30 倍的页面加载速度来说,这是值得的!


如果您使用 PhpStorm,它的自动上传功能比 rsync 效果更好。 PhpStorm 创建了许多临时文件,这些文件可能会绊倒文件观察者,但是如果您让它自己处理上传,它会很好地工作。


一种选择是使用lsyncd 我在 Ubuntu 主机 -> FreeBSD 来宾上使用它取得了巨大的成功。 我还没有在 Windows 主机上尝试过。

为了帮助您解决问题,我找到了这个博客,其中讨论了如何优化 Laravel 生产。 您需要做的大部分事情来使您的应用程序运行速度现在都掌握在您的代码效率、网络容量、CDN、缓存、数据库方面。

现在我来谈谈这个问题:

Laravel 开箱即用很慢。 有一些方法可以优化它。 您还可以选择在您的代码中使用缓存,改进您的服务器机器,yadda yadda yadda。 但最终 Laravel 仍然很慢。

Laravel 使用了很多 symfony 库,正如您在techempower 的基准测试中所看到,symfony 排名非常低(至少最后一点)。 您甚至可以发现 Laravel 基准测试几乎位于底部。

许多自动加载在后台发生,你甚至可能不需要的东西都被加载了。 所以从技术上讲,因为 laravel 易于使用,它可以帮助您快速构建应用程序,也可以使其变慢。

但我并不是说 Laravel 不好,它很棒,在很多方面都很棒 但是,如果您预计流量会激增,您将需要更多硬件来处理请求。 这会让你付出更多的代价。 但是如果你很有钱,那么你可以用 Laravel 实现任何目标。 :D

通常的权衡:

 Easy = Slow, Hard = Fast

我认为 C 或 Java 的学习曲线和可维护性都很难,但它在 Web 框架中的排名非常高。

虽然关系不大。 我只是想证明easy = slow的要点:

红宝石在可维护性和学习它的难易程度有很好的口碑,但它也被认为是Python和PHP中最低如图所示这里

在此处输入图片说明

是的 - Laravel 真的很慢。 为此,我构建了一个 POC 应用程序。 简单的路由器,带有登录表单。 在 20 美元的数字海洋服务器(几 GB 内存)上,我只能获得60 RPS和 10 个并发连接;

设置:

2gb RAM
Php7.0
apache2.4
mysql 5.7
memcached server (for laravel session)

我运行了优化、composer dump autoload 等,它实际上将 RPS 降低到 43-ish

问题是应用程序在 200-400 毫秒内响应。 我在 laravel 所在的本地机器上运行了 AB 测试(即,不是通过网络流量); 而我只有 112 RPS; 响应时间快 200 毫秒,平均为 300 毫秒。

相比之下,我测试了我的生产 PHP Native 应用程序,每天在 AWS t2.medium(x3,负载平衡)上运行几百万个请求。 当我通过 ELB 从本地机器到 Web 的 AB 建立 25 个并发连接时,我获得了大约 1200 RPS。 负载机器与 Laravel“登录”页面的巨大差异。

这些页面包含会话(elasticache / memcached)、实时数据库查找(通过 memcached 缓存查询)、通过 CDN 拉取的资产等,等等。

我能说的是,laravel 对事物的负载大约为 200-300 毫秒。 对于 PHP 生成的视图来说很好,毕竟这种类型的延迟在加载时是可以容忍的。 但是,对于使用 Ajax/JS 处理小更新的 PHP 视图,它开始感到迟钝。

当 200 个机器人同时抓取 100 个页面时,我无法想象这个系统在一个多租户应用程序中会是什么样子。

Laravel 非常适合简单的应用程序。 如果您不需要做任何需要中间件废话的花哨的事情(IE,没有多租户应用程序和自定义域等),Lumen 是可以接受的;

但是,我从不喜欢从可以绑定并导致“hello world”帖子加载 300 毫秒的内容开始。

如果你在想“谁在乎?”

.. 编写一个预测搜索,该搜索依赖于快速查询来响应数十万个结果中的自动完成建议。 200-300 毫秒的延迟会让您的用户绝对疯狂。

我发现 Laravel 4 的最大速度增益可以实现选择正确的会话驱动程序;

Sessions "driver" file;

Requests per second:    188.07 [#/sec] (mean)
Time per request:       26.586 [ms] (mean)
Time per request:       5.317 [ms] (mean, across all concurrent requests)


Session "driver" database;

Requests per second:    41.12 [#/sec] (mean)
Time per request:       121.604 [ms] (mean)
Time per request:       24.321 [ms] (mean, across all concurrent requests)

希望有帮助

在我的 Hello World 比赛中,Laravel 是哪一个? 我想你可以猜到。 我使用 docker 容器进行测试,这是结果

制作 http 响应“Hello World”:

  • 带有日志处理程序标准输出的 Golang:6000 rps
  • 带有日志处理程序标准输出的 SpringBoot:3600 rps
  • Laravel 5 关闭日志:230 rps

我经常使用 Laravel,我只是不相信它告诉我的数字,因为我的浏览器测量的端到端渲染显示从请求到准备的总时间较短。

此外,我在工作时在我的机器上得到的数字略高,它执行页面的速度明显比我在家中的机器快。

我不知道这些数字是如何计算出来的,但它们并没有得到观察或 Firebug 等浏览器工具的证实......

Laravel 实际上并不是那么慢,尤其是在优化时。 然而,它是内存饥渴的。 即使是像 Drupal 这样非常慢的重型 CMS,它的内存占用似乎也只有 Laravel 裸机请求的 1/3 左右。

因此,为了在生产环境中运行 Laravel,我会在 CPU 优化服务器之前部署到内存优化服务器。

我知道这是一个有点老的问题,但事情发生了变化。 Laravel 并没有那么慢。 如前所述,同步文件夹很慢。 但是,在 Windows 10 上我无法使用rsync 我尝试了cygwinminGW git for windows ssh git for windows版本,似乎rsyncgit for windows不兼容。

这对我有用NFS

流浪文档说:

NFS 文件夹在 Windows 主机上不起作用。 Vagrant 将忽略您对 Windows 上 NFS 同步文件夹的请求。

这已经不是真的了。 我们现在可以使用vagrant-winnfsd插件 安装非常简单:

  1. 执行vagrant plugin install vagrant-winnfsd
  2. 更改您的Vagrantfileconfig.vm.synced_folder ".", "/vagrant", type: "nfs"
  3. 添加到Vagrantfile : config.vm.network "private_network", type: "dhcp"

这就是我使NFS工作所需的全部内容。 对我来说,Laravel 响应时间从 500 毫秒减少到 100 毫秒。

由于没有其他人提到它,我发现 xdebug 调试器大大增加了时间。 我提供了一个基本的“Hello World,时间是 2020-01-01T01:01:01.010101”动态页面,并在我的 httpd.conf 中使用它来为请求计时:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" **%T/%D**" combined

%T 是以秒为单位的服务时间,%D 是以微秒为单位的时间。 在我的 php.ini 中:

[XDebug]
xdebug.remote_autostart = 1
xdebug.remote_enable = 1

我得到了大约 770 毫秒的响应时间,但是当这两个都设置为 0 以禁用它们时,它立即跳到了 160 毫秒。 运行这两个将其降低到 120 毫秒:

php artisan route:cache
php artisan config:cache

缺点是如果我进行了配置或路由更改,我需要重新缓存它们,这很烦人。

作为旁注,奇怪的是,将站点从我的 SSD 移动到旋转 HDD 没有提供任何性能优势,这对我来说非常奇怪,但我想它可能被缓存了,我在 Windows 10 上使用 XAMPP。

我在1.40s使用纯 laravel 时遇到了1.40s

问题是使用: php artisan serve来运行网络服务器

当我使用 apache 网络服务器(或 NGINX)代替相同的代码时,我将其降低到153ms

在排除慢速加载时间 +300ms 引导时遇到此问题 Laravel 9. 发现禁用 xdebug 并重新加载 apache 和 php-fpm 将时间减少到 20ms。 如果在 dev 中启用了 xdebug ... 就不会在 prod 中启用,但必须确定性能。

我手头没有任何基准测试,但众所周知,缓存可以显着提高速度,Laravel 至少有四种不同类型的缓存用于不同的资产。 php artisan optimize命令可用于触发所有这些缓存操作, php artisan optimize:clear执行相反操作并使所有缓存无效。

一般来说,我认为这个想法是在开发/调试时运行后者,以阻止缓存数据妨碍您,并在您停止当天的开发/调试后立即在实时站点上运行后者。

Laravel 很慢,因为在大多数情况下,对网页使用 PHP 很慢。

使用 Laravel,整个框架在每次调用时都会重新构建——这就是所有页面都指向 index.php 的原因。 由于整个框架是 PHP 脚本,它们都需要通过 PHP 解释器——每次。 框架越大,这需要的时间越长。

将此与“服务器环境”(例如 tomcat)进行对比,其中服务器运行一次初始化代码,最终所有页面都将使用本机代码(在 JIT 之后)。

作为参考示例,使用相同的硬件、操作系统等。在此硬件上使用 JSP 的简单“hello world”为 3000 rps,laravel 上的相同 hello world 为 51 rps。

测试框架开销以及由此产生的每个核心的最大 RPS 的最简单方法是使用 Apache AB 和并发值 1,以及一个简单的动态“hello world”(以避免静态页面缓存)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM