Laravel真的这么慢吗?


80

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

laravel计时

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


6
尝试跑步php artisan optimize --force
Joseph Silber 2014年

12
公平地说,您看到的加载时间是在调试模式下。您使用的调试栏会使应用程序运行速度大大降低。
kajetons 2014年

4
您的环境是什么样的?与在VM上本地开发相比,我在VPS上看到更快的速度。
kreeves 2014年

2
@Artsemis刚刚安装了所有内容。它的速度是它的两倍多,刷新几次后便崩溃了。
mpen 2014年

9
是的,不要希望使用Vagrant可以快速进行操作。Symfony页面通常需要1-2s才能加载到Vagrant中,而生产则需要50ms。
Matthieu Napoli 2014年

Answers:


97

Laravel是不是实际上缓慢的。500-1000ms是荒谬的;我在调试模式下将时间缩短到20ms。

问题是Vagrant / VirtualBox +共享文件夹。我没意识到他们招致了如此高的表现。我猜是因为Laravel有这么多的依赖项(加载约280个文件),并且每个文件的读取速度都很慢,所以加起来确实很快。

kreeves向我指出了正确的方向,此博客文章介绍了Vagrant 1.5中的一项新功能,功能使您可以将文件同步到VM中,而不使用共享文件夹。

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 guest虚拟机上使用它取得了巨大的成功。我还没有在Windows主机上尝试过它。


除了使用rsync之外,您还采取了哪些措施来提高性能?
jpcamara 2014年

2
@jpcamara没事。仅靠Rsync就可以将其降低到约20ms。您可以在HHVM下运行它,关闭所有调试并artisan optimize稍作提升。剩下的大部分就是我认为的应用程序设计方式。安装barryvdh/laravel-debugbar并查看是否有任何问题。
mpen 2014年

2
如何在20毫秒内加载280个文件?这里使用某种编译/ OPcache?假设有固态硬盘存储,当然。
曼努埃尔·阿威德·施密特

1
据泰勒·奥特威尔(Taylor Otwell)称,拉拉维尔5.2的速度甚至快了25%:twitter.com/taylorotwell/status/674327734252892161
Koga

1
使用NFS文件共享而不是默认文件共享。将所有内容加速10倍...修改您的Vagrant文​​件,以将文件系统强制安装为NFS:config.vm.synced_folder“。”,“ / vagrant”,键入:“ nfs”,nfs:true,nfs_udp:false,nfs_version:3
Didzis

24

为了帮助您解决问题,我找到了这个博客,其中介绍了如何优化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中最低如图所示这里

在此处输入图片说明


91
这些图形与问题有什么关系?
NullPoiиteя

3
PHP7比PHP5快得多
Cobolt

什么意思 轻松=缓慢只会进一步加剧对特定语言的毫无根据的误解
克里斯(Chris)

在信息图表中,一个错误是Pyhon不受Java的影响,因为Java于1995年发明,而python在1991
。– Haritsinh Gohil19年

@HaritsinhGohil Python 3于2008
。– majidarif

15

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

建立:

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进行25个并发连接时,我获得了大约1200 RPS。与负载和laravel“登录”页面相比,具有负载的计算机上的巨大差异。

这些页面包含会话(elasticache / memcached),Live DB查找(通过memcached缓存的查询),通过CDN提取的资产等,等等。

我所知道的是,laravel会在大约200-300ms的负载上保持负载。毕竟,对于PHP生成的视图来说,这种延迟类型在加载时是可以容忍的。但是,对于使用Ajax / JS处理小的更新的PHP视图,它开始变得迟钝。

我无法想象该系统在多租户应用程序的情况下会是什么样子,而200个机器人同时会分别抓取100个页面。

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

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

如果您在想“谁在乎?”

..编写预测搜索,该搜索依靠快速查询来响应数十万个结果中的自动完成建议。200-300ms的延迟将使您的用户完全疯狂。


2
为什么中间件胡说八道?希望用事实进行解释,以便我们所有人都可以断言这是胡说?另外,我运行了一个Laravel安装程序,该安装程序可以在80到65毫秒之间愉快地响应(是的,它在40亿条记录表上执行数据库查询),所以我很想知道您的情况。
Mjh '17

2
你显然很喜欢laravel。我设置了基本安装,进行了优化,但收到的效果不佳。我发现它需要中间件和逆向工程来处理路由前处理。这并不理想。只是因为您安装了“ YOUR” laravel来进行优化,所以很棒。它无关紧要。路由HELLO WORLD的基本程序包比简单的路由框架和细枝模板引擎重,慢。两者都可以缓存吗?优化?改善了吗?是。这是重点吗?不,Laravel很重。沉重是较慢。世界对此表示同意。如果愿意,可以使用它,但这不是神学。:)
尼克

1
我喜欢花更少的时间。我真的不在乎框架/技术/什么,我假设您是相同的。花费更少的时间实现目标=这是我书中的胜利。现在,是的,Laravel很重。与基本语言相比,每个框架都很沉重。与任何程序/软件一样,Laravel可以快速运行,这就是我的评论。如果框架有帮助,那么您需要使其更快地运行-这是可以实现的。
Mjh

您正在将在$ 20 DO服务器上运行的Laravel的未配置/优化/缓存实例与在$ 400高度优化/优化/缓存的服务器基础结构上运行的自定义构建,高度优化/优化/缓存的php应用程序进行比较,然后抱怨说未优化的应用程序运行缓慢?不要误会我的意思,所有框架开箱即用!没有办法调整适合所有人的框架。另外,大多数框架都是首先为开发环境设置的。自动加载速度慢,模板未缓存等。请比较一个苹果与一个苹果,而不是一个苹果与法拉利,或者在这种情况下,一个Zonda ...
jacobfogg

1
CodeIgniter开箱即用。实际上,CodeIgniter几乎与PHP本身一样快。PHP = 300 rps,CodeIgniter =295。Laravel远低于此。Zend大约是30 rps,而蛋糕,据我所知,高达3 rps。没有两个框架是平等的。有几个苹果要看。但是,优化Laravel可能会给您60毫秒的负载,想象一下优化Code​​Igniter会为您带来什么。;)
网站站长G

13

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

希望能有所帮助


1
很明显,我建议任何人都不要使用文件作为会话。考虑可扩展性:)
jeveloper

6
@jeveloper什么?在此示例中,文件比数据库快4倍以上
developerbmw

1
@Brett着眼于“可扩展性”,确保对可能的远程计算机的文件与网络调用(即使是在同一VPC内)的速度较慢,但​​至少是可持续的,并且您可以捕获会话数据
jeveloper

@jeveloper文件系统不可持续吗?我肯定希望如此,因为无论如何这是大多数数据库的基础存储。
developerbmw

3
@developerbmw他想说的是,如果您有一个负载均衡器和多个实例为您的应用程序提供服务,则使用本地服务器的文件系统是不可扩展的。
克里斯·哈里森

11

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

制作http响应的“ Hello World”:

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

不知道为什么将其标记为“自己”,是的,也许更适合作为注释。尽管我在Docker容器中也经历了极慢的响应时间,但响应时间却很

您是否尝试过路由缓存?
奥古兹灿Sertel

什么是rps?每秒请求数?
user3494047 2017年

3
Hello world是有史以来最好,最有用的应用程序,尤其是用于有意义的测试时。它完全涵盖了您需要了解的所有内容,从哪个组件开始使用包/包管理器对某种语言的支持。
Mjh

1
我只想要没有其他复杂依赖性的性能基准
Aggarat .J

5

我使用Laravel相当多,但我简直不相信它告诉我的数字,因为用我的浏览器衡量的端到端渲染显示从请求到准备就绪的总时间更少。

此外,我在工作中的机器上获得的数字略高,这确实比在家里的机器上执行页面的速度明显快。

我不知道这些数字是如何计算的,但是并不能通过观察或Firebug之类的浏览器工具来证实。

Laravel实际上并没有那么慢,特别是在优化时。但是,它需要大量内存。甚至像Drupal这样的较重的CMS也很慢,它似乎也只占Laravel请求裸露内存的1/3。

因此,要在生产环境中运行Laravel,我将先部署到内存优化的服务器,再部署CPU优化的服务器。


我不确定这些数字是否正确,但是绝对可以注意到。“特别是经过优化时”是什么意思?您如何优化它?仅仅通过跑步php artisan optimize还是我们可以做更多的事情?
mpen 2014年


3

我知道这是一个古老的问题,但是情况有所改变。Laravel并不慢。如前所述,同步文件夹的速度很慢。但是,在Windows 10上,我无法使用rsync。我想这两个cygwinminGW。似乎rsyncgit for windows的版本不兼容ssh

这对我有用NFS

流浪文档说:

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

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

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

这就是我要做的全部NFS工作。Laravel对我的响应时间从500ms减少到100ms。


您是否通过Windows的Bash尝试了rsync?实际上,我现在正在运行它,并且效果很好。
mpen

不,我没有尝试。我知道,许多人写道rsync也可以与git bash或Windows cmd一起使用。我不知道为什么它对我不起作用。但是我还是找到了另一个解决方案。也许对某人有用。
frutality

1

1.40s在开发区域使用纯laravel时遇到了问题!

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

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


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移到旋转的HDD上并没有带来任何性能优势,这对我来说太奇怪了,但是我想它可能已经被缓存了,因为我在Windows 10上使用XAMPP。


-9

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”(以避免静态页面缓存)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.