我刚开始使用Laravel.我几乎没有编写任何代码,但我的页面需要花费一秒钟才能加载!
当我的无框架应用程序和NodeJS应用需要大约2毫秒时,这对我来说有点令人震惊.什么是Laravel在做什么?这不是正常的行为吗?它需要一些微调吗?
Laravel是不是实际上是缓慢的.500-1000毫秒是荒谬的; 我在调试模式下将其降低到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来宾.我还没有在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 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)
希望有所帮助
是的 - 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的25个并发连接时,通过ELB,我得到大约1200 RPS.带有负载的机器与laravel"登录"页面之间的巨大差异.
这些页面包含Sessions(elasticache/memcached),Live DB查找(通过memcached缓存查询),通过CDN提取的资产等等.
我可以说,laravel大约200-300毫秒的东西加载.毕竟,对于PHP生成的视图来说,这种类型的延迟在加载时是可以容忍的.但是,对于使用Ajax/JS处理小更新的PHP视图,它开始感觉迟钝.
我无法想象这个系统在多租户应用程序中会是什么样子,而200个机器人同时抓取100个页面.
Laravel非常适合简单的应用程序.如果您不需要做任何需要中间件废话(IE,没有多租户应用程序和自定义域等)的任何想象,Lumen是可以容忍的;
但是,我从不喜欢从可以绑定的东西开始并为"hello world"帖子导致300ms负载.
如果你在想"谁在乎?"
..编写一个依赖于快速查询的预测搜索,以响应几十万个结果中的自动完成建议.200-300ms的延迟会让你的用户绝对疯狂.
在我的Hello World比赛中,哪一个是Laravel?我想你可以猜到.我使用了docker容器进行测试,结果如下
要使http响应"Hello World":
Golang与日志处理程序标准输出:6000 rps
带有Log Handler标准输出的SpringBoot:3600 rps
Laravel 5带有关闭日志:230圈