Laravel真的这么慢吗?
我刚开始使用Laravel。 我几乎没有写任何代码,但我的网页加载需要近一秒钟!
当我的无框架应用程序和NodeJS应用程序花费大约2ms时,这对我来说有点令人震惊。 Laravel在做什么? 这是不正常的行为呢? 是否需要一些微调?
Laravel实际上并不那么慢。 500-1000毫秒是荒谬的; 我在debugging模式下将其调低到20ms。
问题是Vagrant / VirtualBox +共享文件夹。 我不知道他们遭受了这样的performance。 我想是因为Laravel有这么多的依赖关系(加载大约280个文件),每个文件读取速度都很慢,加起来非常快。
kreeves指出我正确的方向, 这篇博客文章介绍了Vagrant 1.5中的一个新function,可以让你的文件同步到虚拟机而不是使用共享文件夹。
在Windows上没有本地的rsync客户端,所以你必须使用cygwin 。 安装它,并确保检查Net / rsync。 将C:\cygwin64\bin
添加到您的path。
Vagrant引入了新function 。 我正在使用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
一旦你们全都成立了,就试试看看。 如果一切顺利,你的机器应该启动,它应该复制所有的文件。 你需要在terminal上运行vagrant rsync-auto
来保持文件是最新的。 你会付出一点点延迟,但是加载速度要快30倍,这是值得的!
如果你使用PhpStorm,它的自动上传function甚至比rsync更好。 PhpStorm创build了很多临时文件,可以使文件观察者绊倒,但是如果让它处理上传本身,它可以很好地工作。
为了帮助你解决你的问题,我发现这个博客讨论了如何优化laravel生产。 大部分你需要做的,使您的应用程序快速现在掌握在你的代码是多less效率,你的networking容量,CDN,caching,数据库。
现在我要谈谈这个问题:
Laravel开箱即用。 有办法来优化它。 你也可以select在你的代码中使用caching,改善你的服务器机器,yadda yadda yadda。 但最后Laravel仍然很慢。
Laravel使用了很多symfony库,正如你在techempower的基准testing中看到的那样 ,symfony的排名非常低(至less可以说)。 你甚至可以find拉拉维尔基准几乎在底部。
很多自动加载在后台发生,你可能甚至不需要加载的东西。 所以在技术上,因为laravel易于使用,所以它可以帮助您快速构build应用程序,这也使其变得很慢。
但是我不是说拉拉维尔不好,很多很好 ,很多东西。 但是,如果您预期stream量激增,您将需要更多的硬件来处理请求。 这会花费你更多。 但是如果你富有,那么你可以用Laravel来实现任何事情。 :d
通常的权衡:
Easy = Slow, Hard = Fast
我会考虑C或Java有一个艰难的学习曲线和艰难的可维护性,但它在Web框架中排名非常高。
虽然不太相关。 我只是试图certificateeasy = slow
点:
Ruby在可维护性和易学性方面有很好的声誉,但是它也被认为是python和php中最慢的,如下所示。
我发现用Laravel 4可以获得最大的速度增益,可以select正确的会话驱动程序;
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容器进行testing,这里是结果
为了使http响应“Hello World”:
- Golang与日志处理器stdout:6000 rps
- 带有Log Handler标准输出的SpringBoot:3600 rps
- Laravel 5closures日志:230 rps
是的 – Laravel真的很慢。 为此我build立了一个POC应用程序。 简单的路由器,用login表单。 我只能在20美元的数字海洋服务器上获得60个RPS和10个并发连接(几GB的RAM)。
build立:
2gb RAM Php7.0 apache2.4 mysql 5.7 memcached server (for laravel session)
我运行了优化,composer php自动载入等,它实际上降低了RPS到43 。
问题是应用程序响应200-400毫秒。 我从本地机器laravel上运行ABtesting(即不通过networkingstream量)。 而我只有112 RPS; 平均响应时间为200ms,平均响应时间为300ms。
相比之下,我testing了我的生产PHP本机应用程序每天在AWS t2.medium(x3,负载平衡)上运行几百万个请求。 当我从本地机器到networking上的25个并发连接,通过ELB,我得到了大约1200 RPS。 有负载的机器与laravel“login”页面的巨大差异。
这些是Sessions(elasticache / memcached),Live DB查找(通过memcachedcaching的查询),CDN上的资产等,等等的页面。
我可以告诉,拉拉维尔约200-300ms负载的东西。 毕竟,对于PHP生成的视图来说,这种延迟在负载上是可以忍受的。 但是,对于使用Ajax / JS处理小更新的PHP视图,它开始感觉迟缓。
我无法想象这个系统应该与多租户应用程序的样子是什么,而200个机器人同时抓取100个页面。
Laravel非常适合简单的应用程序。 stream明是可以忍受的,如果你不需要做任何事情需要中间件废话(IE,没有多租户应用程序和自定义域等);
然而,我从来不喜欢从一个可以绑定的东西开始,并为“hello world”发布300ms的负载。
如果你想“谁在乎?”
编写一个预测性search,依靠快速查询来响应几十万条结果中的自动填充build议。 那200-300ms的滞后会让你的用户绝对疯狂。
我使用Laravel相当多,我根本不相信它告诉我的数字,因为我的浏览器测量的端到端渲染显示从请求到准备的总时间较less。
而且,在我的机器上工作的时候,我的数字稍微高一些,而且页面的执行速度明显快于我家里的机器。
我不知道这些数字是如何计算的,但是它们没有被观察或者像Firebug这样的浏览器工具所证实。
Laravel实际上并不是那么慢,特别是在优化时。 但是,这是内存饥饿。 即使像Drupal这样速度很慢的CMS,似乎也只有Laravel裸机的内存需求的三分之一。
因此,要在生产环境中运行Laravel,我将在CPU优化的服务器之前部署到内存优化的服务器。
我知道这是一个老问题,但事情改变了。 Laravel并不那么慢。 正如前面提到的,同步文件夹很慢。 但是,在Windows 10上,我无法使用rsync
。 我尝试了cygwin
和minGW
。 似乎rsync
与git for windows
的ssh
版本的git for windows
不兼容。
这是什么为我工作: NFS 。
stream浪文档说:
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减less到100ms。
以下屏幕截图仅仅是没有实现任何性能方法的示例。
默认的加载速度很less,httpfilter和容器服务。
没有那么慢,你需要以适当的方式configuration你的Laravel。 Laravel有很多优化技术。 试一些。
我已经使用所有stream行的PHP框架进行Web应用程序开发,而我的研究表明, Laravel是有史以来最好的PHP框架,
- 速度/性能
- 可维护性
- 开发人员生产力
- 方便
- 本土化
- 安全
- 可用性
- 可扩展性
- 可测性
- 可部署性