Laravel真的很慢吗?

时间:2014-04-25 03:18:37

标签: performance laravel

我刚开始使用Laravel。我几乎没有编写任何代码,但我的页面需要几秒钟才能加载!

laravel timings

当我的无框架应用程序和NodeJS应用需要大约2毫秒时,这对我来说有点令人震惊。什么是Laravel在做什么?这不是正常的行为吗?是否需要进行微调?

10 个答案:

答案 0 :(得分:87)

Laravel 实际 慢。 500-1000毫秒是荒谬的;我在调试模式下将其降低到20ms。

问题是Vagrant / VirtualBox +共享文件夹。我没有意识到他们的性能受到了打击。我想因为Laravel有很多依赖项(加载~280个文件)并且每个文件读取速度都很慢,所以它加起来非常快。

kreeves指出了正确的方向,this blog post描述了Vagrant 1.5中的一项新功能,它允许您将文件同步到VM而不是使用共享文件夹。

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

Vagrant introduces the new feature。我正在使用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主机上试过它。

答案 1 :(得分:23)

为了帮助解决您的问题,我发现了blog,其中讨论了如何优化laravel生产。现在,您需要做的大部分工作都是为了让您的应用程序更快,您的网络容量,CDN,缓存,数据库。

现在我将讨论这个问题:

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

Laravel使用了很多symfony库,正如你在techempower's benchmarks中看到的那样,symfony排名非常低(最后说的最少)。您甚至可以发现laravel benchmark几乎位于底部。

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

但我并不是说Laravel很糟糕,而是很棒,很多很棒。但是,如果您预计会出现大量流量,那么您需要更多硬件来处理请求。它会花费你更多。但如果你是肮脏的富人那么你可以用Laravel实现任何目标。 :d

通常的权衡:

 Easy = Slow, Hard = Fast

我认为C或Java有一个艰难的学习曲线和难以维护的能力,但它在Web框架中排名很高。

虽然不太相关。我只是想证明easy = slow

的要点

Ruby在可维护性和易学性方面享有很高的声誉,但它也被认为是python和php中最慢的,如here所示。

enter image description here

答案 2 :(得分:12)

我发现使用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)

希望有所帮助

答案 3 :(得分:11)

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

制作http-response" Hello World":

  • Golang与日志处理程序标准输出:6000 rps
  • SpringBoot with Log Handler stdout:3600 rps
  • Laravel 5 with off log:230 rps

答案 4 :(得分:11)

是的 - Laravel真的那么慢。我为此建立了一个POC应用程序。简单的路由器,带有登录表单。我只能在价值20美元的数字海洋服务器(几GB 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-400ms。我从本地机器laravel运行AB测试(即,不通过网络流量);而我只有112 RPS;响应时间快200ms,平均300ms。

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

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

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

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

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

但是,我从不喜欢从可以绑定的东西开始,并为一个" hello world"交。

如果你在思考"谁在乎?"

..编写一个依赖于快速查询的预测搜索,以响应几十万个结果中的自动完成建议。 200-300ms的滞后会让你的用户绝对疯狂。

答案 5 :(得分:4)

我使用Laravel相当多,我根本不相信它告诉我的数字,因为我的浏览器测量的端到端渲染显示从请求到准备就绪的总时间较短。

此外,我的工作机器上的数字略高一些,它的执行速度明显快于家里的机器。

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

Laravel实际上并不是那么慢,特别是在优化时。但是,它很需要内存。即使是像Drupal这样非常慢的重型CMS似乎也只有Laravel请求的内存占用量的1/3左右。

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

答案 6 :(得分:3)

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

这对我有用: NFS

Vagrant docs说:

  

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

这不再适用。我们现在可以使用ssh plugin。它的安装非常简单:

  1. 执行vagrant-winnfsd
  2. 更改vagrant plugin install vagrant-winnfsdVagrantfile
  3. 添加到config.vm.synced_folder ".", "/vagrant", type: "nfs"Vagrantfile
  4. 这就是我需要让config.vm.network "private_network", type: "dhcp"工作的全部内容。对我来说,Laravel的响应时间从500ms减少到100ms。

答案 7 :(得分:1)

在开发区域使用纯幼虫工作时,我遇到了1.40s

问题出在使用:php artisan serve来运行Web服务器

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

答案 8 :(得分:1)

由于没有其他人提到它,因此我发现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

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

php artisan route:cache
php artisan config:cache

不利之处在于,如果我进行了配置或路由更改,则需要重新缓存它们,这很烦人。

作为一个旁注,奇怪的是,将站点从我的SSD移到旋转的硬盘上并没有带来性能上的好处,这对我来说实在是太奇怪了,但是我想它可能已经被缓存了,我在Windows 10上使用XAMPP。

答案 9 :(得分:-3)

Laravel速度很慢,因为在大多数情况下,将PHP用于网页很慢。

使用Laravel,可以在每次调用时重建整个框架-这就是为什么所有页面都指向index.php的原因。由于整个框架都是PHP脚本,因此它们每次都需要经过PHP解释器。框架越大,花费的时间越长。

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

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

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