我刚刚开始使用Laravel。我几乎没有编写任何代码,但是我的页面要花近一秒钟的时间加载!
当我的无框架应用程序和NodeJS应用程序花费约2毫秒时,这让我有些震惊。Laravel在做什么?这不是正常行为吗?需要微调吗?
我刚刚开始使用Laravel。我几乎没有编写任何代码,但是我的页面要花近一秒钟的时间加载!
当我的无框架应用程序和NodeJS应用程序花费约2毫秒时,这让我有些震惊。Laravel在做什么?这不是正常行为吗?需要微调吗?
Answers:
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主机上尝试过它。
artisan optimize
稍作提升。剩下的大部分就是我认为的应用程序设计方式。安装barryvdh/laravel-debugbar
并查看是否有任何问题。
为了帮助您解决问题,我找到了这个博客,其中介绍了如何优化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内存很少)上,我只有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的延迟将使您的用户完全疯狂。
我发现使用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”:
我使用Laravel相当多,但我简直不相信它告诉我的数字,因为用我的浏览器衡量的端到端渲染显示从请求到准备就绪的总时间更少。
此外,我在工作中的机器上获得的数字略高,这确实比在家里的机器上执行页面的速度明显快。
我不知道这些数字是如何计算的,但是并不能通过观察或Firebug之类的浏览器工具来证实。
Laravel实际上并没有那么慢,特别是在优化时。但是,它需要大量内存。甚至像Drupal这样的较重的CMS也很慢,它似乎也只占Laravel请求裸露内存的1/3。
因此,要在生产环境中运行Laravel,我将先部署到内存优化的服务器,再部署CPU优化的服务器。
php artisan optimize
还是我们可以做更多的事情?
我知道这是一个古老的问题,但是情况有所改变。Laravel并不慢。如前所述,同步文件夹的速度很慢。但是,在Windows 10上,我无法使用rsync
。我想这两个cygwin
和minGW
。似乎rsync
与git for windows
的版本不兼容ssh
。
这对我有用:NFS。
流浪文档说:
NFS文件夹在Windows主机上不起作用。Vagrant将忽略您对Windows上NFS同步文件夹的请求。
这不再是真的。我们现在可以使用vagrant-winnfsd
插件。安装非常简单:
vagrant plugin install vagrant-winnfsd
Vagrantfile
:config.vm.synced_folder ".", "/vagrant", type: "nfs"
Vagrantfile
:config.vm.network "private_network", type: "dhcp"
这就是我要做的全部NFS
工作。Laravel对我的响应时间从500ms减少到100ms。
由于没有人提到它,因此我发现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。
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”(以避免静态页面缓存)。
php artisan optimize --force