掌握提高 Web 应用的性能的方法 之 优化 PHP 和 Laravel
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 应用时,就是):
- 语言层面: 这意味着你使用更快的语言版本,并避免语言中特定的功能 / 编码风格,使你的代码速度变慢。
- 框架层面: 这些是我们在本文中要涉及的内容。
- 基础设施层面: 调整你的 PHP 进程管理器、Web 服务器、数据库等。
- 硬件层面: 转向更好、更快、更强大的硬件主机提供商。
所有这些类型的优化都有其存在的意义(例如,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的更多相关文章
- ASP.NET Web API 提升性能的方法实践
ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...
- 如何提高web页面的性能
1.浏览器渲染原理解析 想要提高网页的性能,首要的便是要理解浏览器渲染原理,下面关于浏览器的原理解析,我们以chrome内核webkit为例,其他内核的浏览器原理也基本大同小异,可触类旁通. 如上图所 ...
- ASP.NE的缓存技术提高Web站点的性能
一:我们为什么要使用缓存? 先来理解一下asp.net缓存技术的基本原理:把访问频繁的数据以及需要花大量的时间来加载的数据缓存在内存中,那么用户在下次请求同样的数据时,直接将内存中的数据返回给用户,从 ...
- 提高ASP.NET网站性能的方法
http://www.360doc.com/content/14/0705/18/7662927_392224856.shtml Asp.NET有许多秘密,当你了解了这些秘密后,可以使得你的ASP ...
- ASP.NET Core如何使用压缩中间件提高Web应用程序性能
前言 压缩可以大大的降低我们Web服务器的响应速度,压缩从而提高我们网页的加载速度,以及节省一定的带宽. 何时使用相应压缩中间件 在IIS,Apache,Nginx中使用基于服务端的响应压缩技术.中间 ...
- 提高ASP.NET首页性能的方法
1.js压缩文件,css压缩文件,引用的越少越好. 2.用 HTTP Module 控制页面的生命周期. 3.自定义生成动态页面的静态内容 . 4.页面用GZIP压缩. 5.OutputCache 编 ...
- 使用内存虚拟硬盘 提高ArcGIS server并发性能的一种方法
1 问题提出 1.1 概述 提高ArcGIS server并发性能的方法很多,本文讨论在用户硬件足够强大的情况下(主要是内存足够大),使用内存模拟硬盘来提高数据的读取效率,以达到提高ArcGIS se ...
- Web标准中用于改善Web应用程序性能的各种方法总结
提起Web应用程序中的性能改善,广大开发者们可能会想到JavaScript与DOM访问等基于各种既存技术的性能改善方法.最近,各种性能改善方法被汇总成为一个Web标准. 本文对Web标准中所包含的各种 ...
- 提高 web 应用性能之 CSS 性能调优
简介 Web 开发中经常会遇到性能的问题,尤其是 Web 2.0 的应用.CSS 代码是控制页面显示样式与效果的最直接“工具”,但是在性能调优时他们通常被 Web 开发工程师所忽略,而事实上不规范的 ...
随机推荐
- 设计模式:singleton模式
目的:限制类的实例个数只能是一个 例子: #define AGT_DECLARE_SINGLETON(ClassName) \ public: \ static ClassName *Instance ...
- 17 个 Python 特别实用的操作技巧,记得收藏!
Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短.在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧,例如查找.分割和合并列表等 ...
- 关于C#反射(转载)
反射的用途: (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例. (2)使用Module了解包含模块的程序集以及模块中 ...
- Qt-绘制图表
1 简介 使用Qt的charts模块来绘制图表,案例来自Qt自带的demo. charts模块简介:Qt Chars模块提供了一系列容易使用的图表组件.需要使用charts组件时,需要导入Qt Ch ...
- Java 线程池记录
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- 读取 csv , xlsx 表格并添加总分列
import pandas as pd import numpy as np data = pd.read_excel('学生成绩表.csv',columns = ['学号','姓名','高数','英 ...
- Django学习路4_数据库添加元素,读取及显示到网页上
在 views 中实现对数据库的添加和读取数据库 添加数据 对象 = models 中创建的类名() 对象.列名 = '字段值' 对象.save() 进行保存 return HttpResponse( ...
- ASP.NET Core 监听SQL Server数据库的实时信息
1.开发环境: 开发工具:Visual Studio 2019 数据库:SQL Server2012 开发环境:.Net Core 3.1 2.使用技术: Signalr:实现消息推送 SqlDepe ...
- 预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值
PHP $_POST 变量 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用 ...
- PDO::errorInfo
PDO::errorCode — 返回最后一次操作数据库的错误信息(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 public array PDO::e ...