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. 终于搞懂Spring中Scope为Request和Session的Bean了

    之前只是很模糊的知道其意思,在request scope中,每个request创建一个新的bean,在session scope中,同一session中的bean都是一样的 但是不知道怎么用代码去验证 ...

  2. 获取字符串指定字符的第n次出现位置

    create function uf_findx (@text nvarchar(max),@find_x varchar(200),@find_n int)returns intasbegin -- ...

  3. 阿里P9又有新瓜吃咯,马云震怒!!

    自从蒋凡出轨事件曝光之后,阿里这各种瓜来得就像龙卷风,隔三差五的爆出员工出轨事件,普通员工.中层.高管全覆盖,早已集齐7颗阿里瓜瓜,可以召唤神龙了. 上次的出轨事件过去还没有一个月的时间,今天又爆出来 ...

  4. 自已动手作图搞清楚AVL树

    @ 目录 一.背景 二.平衡二分搜索树---AVL树 2.1 AVL树的基本概念 结点 高度 平衡因子 2.2 AVL树的验证 三.旋转操作 3.1 L L--需要通过右旋操作 3.2 R R--需要 ...

  5. hibearnate的一级缓存和二级缓存的功能

    首先要明白缓存是干什么的,缓存就是要将一些经常使用的数据缓存到内存或者各种储存介质中,当再次使用时可以不用去数据库中查询,减少与数据库的交互,提高性能.再说明一级与二级缓存的作用:一级缓存是Sessi ...

  6. 2Ants(独立,一个个判,弹性碰撞,想象)

    AntsDescriptionAn army of ants walk on a horizontal pole of length l cm, each with a constant speed ...

  7. Spring+hibernate+JSP实现Piano的数据库操作---2.Controller+Service+Dao

    Controller package com.controller; import com.entity.Piano; import org.dom4j.rule.Mode; import org.s ...

  8. matplotlib绘制子图

    fig,subs = plt.subplots(2,2) subs[0][0].plot(data_math_C1) subs[0][0].set_title('C_1 曲线') subs[0][1] ...

  9. cmd 安装第三方库问题

    pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 一定要指定 信任豆瓣源,不然就算换了源 ...

  10. PHP hex2bin() 函数

    实例 把十六进制值转换为 ASCII 字符: <?phpecho hex2bin("48656c6c6f20576f726c6421");?> 以上实例输出结果: He ...