Laravel 有很多东西。但是快不是其中之一。让我们学习一些优化技巧,以加快运行速度!

自从 Laravel 诞生以来,没有一个 PHP 开发人员不受她的影响。他们是喜欢 Laravel 提供的快速开发的初级或中级开发人员,或者是由于市场压力而被迫学习 Laravel 的高级开发人员。

不管怎样,不可否认的是,Laravel 已经振兴了 PHP 生态系统。

对 Laravel 的评价节选

但是,由于 Laravel 竭尽全力让您的事情变得简单,这意味着它在底层做了大量工作,以确保您作为开发人员能有一个舒适的编程体验。 Laravel 所有看似「神奇」的功能都有一层又一层的代码,每当运行一个功能时都需要启动这些代码层。甚至是一个简单的异常都会深究到底层 (从错误那里开始,一直到内核):

对于一个视图中似乎是编译错误的情况,有 18 个函数调用要跟踪。我个人遇到过 40 个的,如果您使用其他库和插件,则可能会更多。

重点是,默认情况下,这样层层嵌套的代码,使得 Laravel 速度很慢。

Laravel 有多慢?

说实话,这个问题根本无法回答,原因有几个。

首先,目前还没有公认的、客观的、合理的标准来衡量网络应用的速度。与什么相比更快或更慢?在什么条件下?

其次,一个 Web 应用取决于很多东西(数据库、文件系统、网络、缓存等),所以谈论速度是很愚蠢的。一个非常快的 Web 应用,如果有一个非常慢的数据库,那么它就是一个非常慢的 Web 应用。

但这种不确定性正是基准测试受欢迎的原因。尽管它们毫无意义,但它们提供了一些 参考框架,帮助我们避免生气。因此,最好有所保留,让我们对 PHP 框架之间的速度有一个错误的、粗略的认识。

根据这个相当值得尊敬的 GitHub 源码,以下是 PHP 框架的对比情况。

你可能根本不会注意到 Laravel 在这里 (即使你真的很努力地眯着眼睛), 除非你把你的目光投到最尾部。是的,亲爱的朋友们,Laravel 排在最后! 现在,理所当然的,这些「框架」中的大多数都不是很实用,甚至没有什么用处,但它确实告诉我们,与其他更流行的框架相比,Laravel 是多么的慢。

通常情况下,这种「慢」在应用中不会出现, 因为我们日常的 Web 应用很少达到很高的数据量。但是一旦达到了(比如高达 200-500 以上的并发量),服务器就会开始阻塞而死。这时候即使扔再多的硬件也解决不了问题,基础架构费用迅速攀升,你对云计算的崇高理想轰然倒塌。

不过,嘿嘿,振作起来吧! 这篇文章并不是讲什么不能做, 而是讲什么可以做。

好消息是, 你可以做很多事情来让你的 Laravel 应用更快。几倍的速度。 是的,不是开玩笑。你可以让同样的代码库变得快速,每个月节省几百美元的基础设施 / 托管费用。 怎么做?让我们开始吧。

四种类型的优化

在我看来,优化可以在四个不同的层面上进行(当涉及到 PHP 应用时,就是):

  1. 语言层面: 这意味着你使用更快的语言版本,并避免语言中特定的功能 / 编码风格,使你的代码速度变慢。
  2. 框架层面: 这些是我们在本文中要涉及的内容。
  3. 基础设施层面: 调整你的 PHP 进程管理器、Web 服务器、数据库等。
  4. 硬件层面: 转向更好、更快、更强大的硬件主机提供商。

所有这些类型的优化都有其存在的意义(例如,php-fpm 的优化是非常关键和强大的)。但本文的重点是纯粹的第 2 类优化:那些与框架相关的优化。

顺便说一下,这些编号背后没有任何理由,也不是一个公认的标准。我只是编了这些。请千万不要引用我的话说:「我们的服务器需要 type-3 优化」,否则你的团队负责人会杀了你,找到我,然后把我也杀了。

现在,我们终于到了应许之地。

要注意 n+1 数据库查询

n+1 查询问题是使用 ORM 时常见的问题。Laravel 有其强大的 ORM,叫 Eloquent,它是如此的漂亮,如此的方便,以至于我们常常忘记了看是怎么回事。

考虑一个非常常见的场景:显示指定客户列表下的所有订单。这在电子商务系统和任何需要显示与某些实体相关的所有实体的列表中非常常见,

我们可以想象有这样一个控制器:

class OrdersController extends Controller
{
// ... public function getAllByCustomers(Request $request, array $ids) {
$customers = Customer::findMany($ids);
$orders = collect(); // new collection foreach ($customers as $customer) {
$orders = $orders->merge($customer->orders);
} return view('admin.reports.orders', ['orders' => $orders]);
}
}

太好了!更重要的是,优雅,美丽。

掌握提高 Web 应用的性能的方法 之 优化 PHP 和 Laravel的更多相关文章

  1. ASP.NET Web API 提升性能的方法实践

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  2. 如何提高web页面的性能

    1.浏览器渲染原理解析 想要提高网页的性能,首要的便是要理解浏览器渲染原理,下面关于浏览器的原理解析,我们以chrome内核webkit为例,其他内核的浏览器原理也基本大同小异,可触类旁通. 如上图所 ...

  3. ASP.NE的缓存技术提高Web站点的性能

    一:我们为什么要使用缓存? 先来理解一下asp.net缓存技术的基本原理:把访问频繁的数据以及需要花大量的时间来加载的数据缓存在内存中,那么用户在下次请求同样的数据时,直接将内存中的数据返回给用户,从 ...

  4. 提高ASP.NET网站性能的方法

    http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml   Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...

  5. ASP.NET Core如何使用压缩中间件提高Web应用程序性能

    前言 压缩可以大大的降低我们Web服务器的响应速度,压缩从而提高我们网页的加载速度,以及节省一定的带宽. 何时使用相应压缩中间件 在IIS,Apache,Nginx中使用基于服务端的响应压缩技术.中间 ...

  6. 提高ASP.NET首页性能的方法

    1.js压缩文件,css压缩文件,引用的越少越好. 2.用 HTTP Module 控制页面的生命周期. 3.自定义生成动态页面的静态内容 . 4.页面用GZIP压缩. 5.OutputCache 编 ...

  7. 使用内存虚拟硬盘 提高ArcGIS server并发性能的一种方法

    1 问题提出 1.1 概述 提高ArcGIS server并发性能的方法很多,本文讨论在用户硬件足够强大的情况下(主要是内存足够大),使用内存模拟硬盘来提高数据的读取效率,以达到提高ArcGIS se ...

  8. Web标准中用于改善Web应用程序性能的各种方法总结

    提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...

  9. 提高 web 应用性能之 CSS 性能调优

    简介 Web 开发中经常会遇到性能的问题,尤其是 Web 2.0 的应用.CSS 代码是控制页面显示样式与效果的最直接“工具”,但是在性能调优时他们通常被 Web 开发工程师所忽略,而事实上不规范的 ...

随机推荐

  1. vs code的使用(一) Format On Paste/Format On Save/ Format On Type

    很多经典的问题可以搜索出来,但是一些很小的问题网上却没有答案 (这是最令人发狂的,这么简单,网上居然连个相关的信息都没有给出) (就比如我想保存后自动格式化,但网上的大部分都是如何取消保存后自动格式化 ...

  2. 用x种方式求第n项斐波那契数,99%的人只会第一种

    大家好啊,我们又见面了.听说有人想学数据结构与算法却不知道从何下手?那你就认真看完本篇文章,或许能从中找到方法与技巧.     本期我们就从斐波那契数列的几种解法入手,感受算法的强大与奥妙吧. 原文链 ...

  3. 水题----根据O出现次数判断分数

    There is an objective test result such as \OOXXOXXOOO". An `O' means a correct answer of a prob ...

  4. vue学习(一)初步了解 vue实例

    //html:<div id="app"> <p>{{msg}}<p></div> //script 需要引入jar包vue-2.4 ...

  5. css中的名词

    用到的单词 current 当前 hover 悬停 selected 挑选 disabled 禁用 focus 得到焦点 blur 失去焦点 checked 勾选 success 成功 error 出 ...

  6. 图解Kubernetes——故障排查指南

    针对越来多的Kubernetes容器云,对Kubernetes集群的故障排查却成了一个棘手问题.本文虫虫给大家以直观图示方式介绍如何排查Kubernetes的故障.该篇是系列文章续——故障排查篇. 概 ...

  7. laravel报错1071 Specified key was too long; max key length is 1000 bytes

    Laravel 默认使用utf8mb4字符编码,而不是的utf8编码.因此运行php artisan migrate会出现如下错误: [Illuminate\Database\QueryExcepti ...

  8. Window版本的Python安装库大全

    1. 位置 python的pip安装包网站 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载方法 wget https://download.lfd.uci ...

  9. Python爬虫的经典多线程方式,生产者与消费者模型

    在之前的文章当中我们曾经说道,在多线程并发的场景当中,如果我们需要感知线程之间的状态,交换线程之间的信息是一件非常复杂和困难的事情.因为我们没有更高级的系统权限,也没有上帝视角,很难知道目前运行的状态 ...

  10. 如何利用NLog输出结构化日志,并在Kibana优雅分析日志?

    上文我们演示了使用NLog向ElasticSearch写日志的基本过程(输出的是普通文本日志),今天我们来看下如何向ES输出结构化日志.并利用Kibana中分析日志. NLog输出结构化日志 Elas ...