Laravel 应用的终极性能检查清单

发布于 作者

The Ultimate Performance Checklist For Laravel Apps image

Laravel 在开箱即用时就很快,但是如果您优化了配置和应用程序代码,则可以使其更快。本指南列出了从快速获胜到高级技术的广泛性能技巧,这些技巧将帮助您使您的 Laravel 应用成为客户想要的精简高效的机器。

Enlightn 的人员帮助我们编制了本指南。如果您正在寻找针对 Laravel 的自动化性能或安全工具,请查看他们!

为什么性能很重要?

我们都同意,我们更喜欢加载速度快的应用,而不是加载速度慢的应用。

根据 Google 的一项研究,53% 的移动用户会离开一个加载时间超过 3 秒的网站。移动网站的平均加载时间约为 15 秒。这就是性能的重要性!

您的应用每加载慢一秒,您可能会失去客户转化率。值得庆幸的是,对于 Laravel 应用来说,这不是一个很难解决的问题。

1. 使用内置的性能快速获胜

Laravel 提供了一些内置的性能快速获胜,这些快速获胜可以应用于任何应用程序。

最显著的性能快速获胜是 路由缓存。您知道吗,每次您启动 Laravel 应用时,您的应用都会确定中间件,解析别名,解析路由组,并识别每个路由条目的控制器操作和参数输入?

您可以使用 route:cache Artisan 命令缓存所有必需的路由信息来绕过路由处理。

php artisan route:cache

此命令可以为您提供高达 5 倍的性能提升!它可以对您的应用性能产生重大影响。

除了路由缓存外,Laravel 还提供以下内容

  • 配置缓存 以在每次应用启动时绕过解析您的 .envconfig 文件。
  • 视图缓存 以预编译您的 Blade 模板视图。
  • 事件缓存 以缓存您的应用所有事件和监听器的清单。

提示:您应该确保将上述缓存命令添加到您的部署脚本中,以便每次部署时都会重新缓存您的路由、配置、视图和事件。否则,您对路由或配置文件所做的任何更改都不会更新到您的应用程序中。

2. 优化 Composer

Laravel 开发人员有时会犯的一个常见错误是在生产环境中安装所有依赖项。一些开发软件包(如 Ignition)会在内存中记录您的查询、日志和转储,以便为您提供带有上下文的友好错误消息以方便调试。虽然这在开发中很有用,但它可能会在生产环境中降低您的应用程序速度。

在您的部署脚本中,请确保在使用 Composer 安装软件包时使用 --no-dev 标志。

composer install --prefer-dist --no-dev -o

此外,请确保在生产环境中使用上述的 -o' 标志。这使 Composer 能够通过生成“类映射”来优化自动加载器。

如果您应用在运行时不会生成类,则可以选择使用 --classmap-authoritative 标志代替 -o' 标志以进一步优化。请务必查看 Composer 文档中有关自动加载器 优化策略 的内容。

3. 选择合适的驱动程序

选择合适的缓存、队列和会话驱动程序会对应用程序性能产生很大影响。

对于生产环境中的缓存,我们建议使用内存缓存驱动程序,如 Redis、Memcached 或 DynamoDB。您可以考虑对单服务器设置使用本地文件系统缓存,尽管它会比内存选项慢。

对于排队,我们建议使用 Redis、SQS 或 Beanstalkd 驱动程序。数据库驱动程序不适合生产环境,并且已知存在死锁问题。

对于会话,我们建议使用数据库、Redis、Memcached 或 DynamoDB 驱动程序。Cookie 驱动程序具有文件大小和安全限制,不建议用于生产环境。

4. 将耗时任务排队

在典型的 Web 请求期间,可能有一些特定任务需要很长时间才能执行。Laravel 拥有一个一流的 排队系统,允许我们将耗时任务移动到排队作业中,以便您的应用程序能够以极快的速度响应请求。

此类任务的常见示例包括解析和存储 CSV 文件、与第三方 API 交互、向用户发送通知、昂贵的数据库查询以及更新您的搜索索引。

5. 在文本格式文件上设置压缩头

压缩头会对应用程序性能产生重大影响。确保您在 Web 服务器或 CDN 上为文本格式文件(如 CSS、JS、XML 或 JSON)启用了压缩头。

大多数图像格式都已压缩,并且不是文本格式文件(SVG 除外,SVG 是 XML 文档)。因此,图像格式不需要压缩。

您可以在 Web 服务器或 CDN 级别设置 gzip 或 brotli(最好两者都设置,因为 brotli 可能不支持旧版浏览器),以实现巨大的性能提升。

通常,压缩可以将您的文件大小减少约 80%!

6. 在静态资产上设置缓存头

缓存可以为您的应用程序提供性能提升,特别是对于静态资产(如图像、CSS 和 JS 文件)。建议在 Web 服务器级别或 CDN 级别(如果适用)启用缓存控制头。如果您希望在 Laravel 应用中而不是在 Web 服务器中设置这些头,则可以使用 Laravel 的 缓存控制中间件

缓存头可确保浏览器在后续访问您的网站时不会请求静态资产。这可以增强您的用户体验,因为您的网站在后续访问中加载速度更快。

确保您使用缓存清除,以便在更改 CSS 或 JS 代码时,浏览器不会依赖过时的缓存内容。Laravel Mix 开箱即用地提供 缓存清除

7. 考虑使用 CDN 来提供资产

内容交付网络 (CDN) 是一组地理分布的服务器,它们通过使用附近的服务器将内容提供给更靠近应用程序访问者的位置。这使访问者能够体验更快的加载时间。

除了更快的加载时间外,CDN 还具有其他优势,例如减少 Web 服务器负载、DDoS 防护以及对提供资产的分析。

一些流行的 CDN 包括 Cloudflare、AWS Cloudfront 和 Azure CDN。大多数 CDN 在一定的用量阈值内是免费的。请考虑使用 CDN 来提高资产提供性能。

Laravel 为 Mixasset 助手函数开箱即用地提供了 CDN 支持。

8. 缩小您的 JS 和 CSS 代码

缩小会从您的应用程序中删除对执行不必要的代码(如注释、空格、使用较短名称重命名变量以及其他优化)。在生产环境中缩小 JS 和 CSS 文件总是一个好主意。

当您运行生产脚本时,Laravel Mix 开箱即用地提供 缩小

9. 明智地使用缓存

Laravel 内置了缓存支持。缓存最适合用于读操作密集型工作负载。这些工作负载通常涉及耗时的数据检索或数据处理任务。

缓存的一些常见用例包括

  • 缓存静态页面:缓存静态页面是不言而喻的。Laravel 的网站对每个文档页面都使用了页面缓存
  • 片段或部分缓存:有时,可能需要缓存页面片段,而不是缓存整个页面。例如,您可能希望缓存包含用户名和个人资料图片的页面页眉。您可以在一次操作中缓存页眉片段,而不是每次都从数据库中获取数据。
  • 查询缓存:如果您的应用程序频繁地查询很少更改的数据库项,缓存这些查询可能很有用。例如,如果您运营一家电子商务商店,您可能希望缓存商店主页上显示的商品,而不是在每次访问商店时都从数据库中获取这些商品。

请记住,缓存不适用于“长尾”(很少请求的项)。相反,应谨慎地将其用于高频数据检索(与数据更新相比)。

您还必须确保在缓存内容更改时使缓存失效或刷新。例如,如果您正在缓存个人资料页眉,请在用户更新个人资料图片后刷新缓存。

10. 识别应用程序的性能瓶颈

如果您的某些页面加载时间很长或内存使用率很高,则识别性能瓶颈可能至关重要。Laravel 生态系统中存在许多工具可以帮助您做到这一点,包括 Laravel Telescope、Laravel Debugbar 和 Clockwork。

一些常见的性能瓶颈包括

  • N+1 查询:如果您的代码针对每条记录执行一个查询,则会导致更多网络往返和更多查询。这可以通过使用 Laravel 的预加载来解决。
  • 重复查询:如果您的代码对同一请求执行相同的查询多次,则可能会减慢应用程序的速度。通常,可以通过将数据计算或检索提取到单独的类中来解决这些问题,即使多个服务或类需要相同的​​数据集。
  • 高内存使用率:为了减少应用程序中的内存使用量,请考虑使用延迟集合查询分块来减少模型水合。对于存储文件,请查看自动流式传输以减少内存使用量。
  • 慢速查询:如果您的查询执行时间过长,您应该考虑查询缓存和/或使用 explain 语句来优化查询执行计划。

如果您无法使用上述调试工具识别应用程序中的性能瓶颈,您可以考虑使用 XDebug 或 Blackfire 等性能分析工具。

结论

性能是一个广泛的话题,但 Laravel 内置了许多组件,例如 Mix、队列和缓存,使性能看起来很容易!我们希望您能从中学到一些关于提升应用程序性能的新知识。

Paras Malhotra photo

金融科技 CEO。Enlightn 的联合创始人。Laravel 框架贡献者和开源爱好者。

Cube

Laravel 时事通讯

加入 40,000 多名其他开发者,绝不错过新的技巧、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发者必备的代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

无妥协

Joel 和 Aaron,来自 No Compromises 播客的两名经验丰富的开发者,现在可以为您的 Laravel 项目雇用。⬧ 每月 7500 美元固定费用。

无妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序成功。

Kirschbaum
Shift logo

Shift

正在运行旧版 Laravel 版本?即时、自动化的 Laravel 升级和代码现代化,使您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

让经验丰富的 Laravel 开发者(拥有 4-6 年经验)为您的项目充电,每月只需 2500 美元。获得 160 小时的专业知识和 15 天的无风险试用。立即安排电话会议!

Bacancy
Lucky Media logo

Lucky Media

立即获得 Lucky - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、漂亮结帐、管理面板、用户仪表板、身份验证、即用型组件、统计信息、博客、文档等等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,帮助企业取得成功

Rector
MongoDB logo

MongoDB

通过强大的 MongoDB 和 Laravel 集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包在您的 Laravel 应用程序中添加评论

阅读文章