掌握提高 Web 应用的性能的方法 之 优化 PHP 和 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-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(); $orders = collect(); new collection foreach ($customers as $customer) { $orders = $orders->merge($customer->orders); } return view('admin.reports.orders',['orders' => $orders]); } } 太好了!更重要的是,优雅,美丽。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |