Laravel 应用的终极性能检查清单
发布于 作者 Paras Malhotra
Laravel 在开箱即用时就很快,但是如果您优化了配置和应用程序代码,则可以使其更快。本指南列出了从快速获胜到高级技术的广泛性能技巧,这些技巧将帮助您使您的 Laravel 应用成为客户想要的精简高效的机器。
Enlightn 的人员帮助我们编制了本指南。如果您正在寻找针对 Laravel 的自动化性能或安全工具,请查看他们!
为什么性能很重要?
我们都同意,我们更喜欢加载速度快的应用,而不是加载速度慢的应用。
根据 Google 的一项研究,53% 的移动用户会离开一个加载时间超过 3 秒的网站。移动网站的平均加载时间约为 15 秒。这就是性能的重要性!
您的应用每加载慢一秒,您可能会失去客户转化率。值得庆幸的是,对于 Laravel 应用来说,这不是一个很难解决的问题。
1. 使用内置的性能快速获胜
Laravel 提供了一些内置的性能快速获胜,这些快速获胜可以应用于任何应用程序。
最显著的性能快速获胜是 路由缓存。您知道吗,每次您启动 Laravel 应用时,您的应用都会确定中间件,解析别名,解析路由组,并识别每个路由条目的控制器操作和参数输入?
您可以使用 route:cache
Artisan 命令缓存所有必需的路由信息来绕过路由处理。
php artisan route:cache
此命令可以为您提供高达 5 倍的性能提升!它可以对您的应用性能产生重大影响。
除了路由缓存外,Laravel 还提供以下内容
提示:您应该确保将上述缓存命令添加到您的部署脚本中,以便每次部署时都会重新缓存您的路由、配置、视图和事件。否则,您对路由或配置文件所做的任何更改都不会更新到您的应用程序中。
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 为 Mix 和 asset 助手函数开箱即用地提供了 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、队列和缓存,使性能看起来很容易!我们希望您能从中学到一些关于提升应用程序性能的新知识。