Laravel8如何进行性能优化?优化技巧分享

Laravel8如何进行性能优化?优化技巧分享

本指南列出了从快速优化到深度调优的各种性能优化技巧,这些技巧可以帮助构建高性能的 Laravel 应用。

在 Enlightn 上有不少同学在帮助我们编写了本指南。如果你正在寻求 Laravel 的自动化性能或安全工具,不妨可以访问这个网站看看。

为什么要提高性能?

毫无疑问,相比加载速度慢的应用程序,用户更喜欢速度更快的应用。

根据谷歌的一项研究,加载时间超过3秒的网站,在移动端会有 53% 的用户流失(选择离开)。而移动网站的平均加载时间约为 15 秒。这就是性能的重要性!

应用每增加一秒的加载时间,客户转化率就会越低。幸运的是,对于 Laravel 应用来说,这并不是一个很难解决的问题。

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

Laravel 内置了一些性能提升功能,简单配置一下即可使用。

最关键的性能提升是 路由缓存 。你是否知道每次启动 Laravel 应用时,都会执行确定中间件、解析别名、解析路由组并指定路由控制器操作和处理请求参数?

可以使用 Artisan 命令 route:cache 来缓存所有必需的路由信息,从而跳过路由处理:

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」来优化自动加载器。

如果你的应用在运行时没有生成类,你可以选择使用 --classmap-authoritative 选项而不是 -o 选项进行进一步优化。请务必查看 Autoloader 的 Composer 文档 优化策略.

3. 选择正确的驱动程序

选择正确的缓存、队列和会话驱动程序将会对应用程序性能产生极大影响。

对于生产环境中的缓存,推荐 Redis、Memcached 或 DynamoDB 等内存缓存驱动程序。你可以考虑将本地文件系统缓存用于单服务器设置,尽管这将比缓存到内存的选项慢。

对于队列,推荐使用 Redis、SQS 或 Beanstalkd 驱动程序。数据库队列驱动不适用于生产环境,并且已知可能会存在死锁问题。

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

4. 将耗时的任务通过队列处理

在典型的 Web 请求过程中,可能会有一些特定任务需要很长时间才能执行完成。Laravel 拥有一流的 队列系统,这可以让我们将耗时的任务转移到队列的任务中,从而让你的应用程序能够以极快的速度响应请求。

一般情况下,这类任务的常见示例包括解析和存储 CSV 文件、与第三方 API 交互、向用户发送通知、存在较长耗时的数据库查询和搜索索引更新。

5. 文本文件设置 HTTP 压缩标头

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

图像格式已经有压缩算法的实现且大多数情况图像格式文件已经被压缩过,并且图像并不是文本格式文件(SVG格式除外,这是XML文档)。因此,图像格式不需要压缩。

巧文书 巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 61 查看详情 巧文书

你可以在 Web 服务器或 CDN 上设置 gzip 或 brotli(较旧的浏览器可能不支持 brotli),以获得较大的性能提升。

通常情况下,压缩可以将文件体积大小减少 80% 左右!

6. 在静态资源上设置 HTTP 缓存标头

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

Cache 消息头字段可以确保浏览器不会在多次访问网站时重复请求静态资源。这可以提高用户体验,因为网站在随后的访问时可以加载更快。

Laravel Mix 提供了开箱即用的缓存清理 功能,以便在更改 CSS 或 JS 代码时,浏览器不会继续使用旧的缓存内容。

7. 使用 CDN 服务加速静态资源

内容交付网络(CDN)是一个基于地理分布式的服务器组,通过使用距离网站访客更近的服务器来提供服务。可以让用户体验到更快的加载时间。

除了更快的加载速度和更短的加载时间外,CDN 还具有其他优点,如减少 Web 服务器负载,DDOS 保护和静态资源服务的分析等。

一些流行的 CDN 包括 CloudFlare、AWS CloudFront 和 Azure CDN。大多数 CDN 都有一定的免费试用额度。请考虑使用 CDN 来提升静态资源的加载性能。

Laravel 在框架中提供了开箱即用的 CDN 支持组件 Mix 和助手函数 路由缓存0。

8. 最小化 JS 和 CSS 代码

最小化脚本将会从你的应用程序中去除对执行不必要的额外代码(如代码注释、空格、缩短变量名以及其他优化)。这是一个在生产环境中减小 JS 和 CSS 文件大小常用且有效的手段。

Laravel Mix 为你的生产脚本提供了开箱即用的 路由缓存1 功能

9. 合理使用缓存

Laravel 内置了 路由缓存2 支持。缓存最适合用于读取繁重的工作负载。这些工作负载通常涉及耗时的数据检索或数据处理任务。

缓存的一些常见场景案例可能包括:

缓存静态页面:缓存静态页面是一件轻而易举的事. Laravel 的官网使用 路由缓存3 的方式缓存每一个文档页面。片段或部分缓存:有时候,相比缓存整个页面,缓存页面片段可能更有用。例如,你可能希望缓存包含用户名和用户头像的页眉。你可以一次性缓存页面页眉片段,而不需要每次都从数据库中获取数据。查询缓存:如果你的应用程序频繁地查询数据库中很少更改的项,则查询缓存可能会很有用。例如,当你经营一家电商网站,你可能希望缓存商城主页上显示的项目分类,而不是在每次访问商城时从数据库中读取这些项目分类。

请记住,缓存对long tail(很少请求的项目)没有用处。相反,对于任何频繁进行的数据检索 (与数据更新相比),应谨慎使用它。

还必须确保每次缓存内容更改时都使缓存无效或刷新缓存。例如,如果您正在缓存配置文件头,则在用户更新其配置文件图片后刷新缓存。

10. 确定您的应用程序的性能瓶颈

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

一些常见的性能瓶颈包括:

N+1个查询:如果您的代码为每个记录执行一个查询,将导致更多的网络往返和更多的查询。这可以在 Laravel 中使用 路由缓存4.重复请求:如果代码在处理同一请求时多次执行同一查询,则可能会减慢您的应用程序的运行速度。通常情况下,如果多个服务或类需要相同的数据集,则可以通过将数据计算或检索提取到单独的类来解决这些问题。高内存使用率:为了减少应用程序的内存使用量,可以考虑使用 路由缓存5 和 路由缓存6 来减少单次处理的数据体积。若要存储文件,请使用 路由缓存7 以减少内存使用。慢查询:如果查询执行时间过长,则应考虑使用查询缓存和/或使用 EXPLAIN 语句来优化查询执行计划。

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

上线检测清单

另外这里有完整的上线检查清单可供参考 路由缓存8。

总结

性能优化是一个永恒的话题,但 Laravel 有几个内置组件,如 Mix、queues 和缓存,这使性能优化看起来很简单!我们希望你在提高应用程序性能方面学到一些新知识。

原文地址:https://laravel-news.com/performance-checklist译文地址:https://learnku.com/laravel/t/55702

【相关推荐:路由缓存9】

以上就是Laravel8如何进行性能优化?优化技巧分享的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/340746.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 18:08:05
下一篇 2025年11月5日 18:10:00

相关推荐

  • 高效初始化PHP数组元素:避免冗余判断的实用技巧

    本文旨在介绍一种简洁高效的PHP数组初始化方法,避免使用繁琐的`if`语句进行存在性判断。通过结合空合并运算符(??)和array_filter()函数,可以在一行代码中实现根据变量是否已定义来动态添加数组元素,从而提高代码的可读性和简洁性。 在PHP中,初始化数组时经常需要根据某些变量是否存在来决…

    2025年12月12日
    000
  • PHP与MySQL:精确筛选当日提醒事项的实现指南

    本教程旨在解决php和mysql应用中,如何精确筛选并显示仅属于当前日期的提醒事项。通过分析常见错误,即使用不当的日期比较运算符和时间格式,文章将详细介绍如何调整sql查询条件(使用等号`=`)和php日期格式化方法(`date(“y-y-d”)`),确保系统只展示当日的待办…

    2025年12月12日
    000
  • 优化Laravel搜索功能:正确处理空搜索词与提升查询性能

    本文旨在解决laravel应用中搜索功能的一个常见问题:当用户清空搜索框并提交时,页面未能显示全部数据。我们将探讨现有实现中的效率瓶颈,并提供一个基于laravel `request::filled()` 方法和eloquent `when()` 条件查询的优化方案,确保在空搜索词提交时正确展示所有…

    2025年12月12日
    000
  • 使用预处理语句和 IN 子句查询 MySQL 时仅返回第一行的问题

    本文旨在解决在使用 MySQL 预处理语句结合 `IN` 子句,并通过字符串绑定传递参数时,仅返回第一行数据的问题。我们将分析问题的原因,并提供正确的解决方案,包括数据库表结构优化的建议。 在使用预处理语句和 IN 子句进行 MySQL 查询时,如果直接将逗号分隔的字符串绑定到 IN 子句中,可能会…

    2025年12月12日
    000
  • Laravel控制器向Blade视图传递数据:完整指南

    本教程详细阐述了在Laravel应用中,如何通过控制器从数据库获取数据并安全有效地传递给Blade视图进行展示。文章涵盖了控制器中数据查询、使用`with()`方法将数据绑定到视图、Blade模板中正确访问数据变量的方法,并指出了常见的错误(如变量名不匹配)及其解决方案,旨在帮助开发者构建清晰、可维…

    2025年12月12日
    000
  • 如何使用 PHP 统计 JSON 文件中特定子目录下的数值总和

    本文旨在指导开发者使用 php 脚本,遍历包含 json 文件的多个子目录,并分别计算每个子目录中 json 对象内特定键(例如 “guests”)对应数值的总和。通过提供的代码示例,您可以轻松地将此方法应用于统计不同月份或类别的 json 数据,并获得清晰的统计结果。 在使…

    2025年12月12日
    000
  • 解决OpenCart 3.0联系我们表单邮件发送失败问题:深度调试指南

    本文旨在提供一份针对opencart 3.0联系我们表单无法发送邮件问题的详细调试指南。我们将从前端视图文件入手,逐步定位后端控制器动作,并通过系统化的代码跟踪和数据验证,帮助您诊断并解决邮件发送故障,确保您的网站联系功能正常运作。 OpenCart 3.0联系我们表单邮件发送故障排查与解决 当您的…

    2025年12月12日
    000
  • 使用 AJAX 和 PHP 正确填充下拉菜单:解决多结果连接问题

    本文旨在解决在使用 AJAX 从 PHP 接收多个结果并填充下拉菜单时,数据连接成单行的问题。通过修改 PHP 代码以 JSON 格式输出数据,并调整 JavaScript 代码以正确解析和处理 JSON 响应,可以实现将每个结果作为下拉菜单的独立选项显示。 在使用 AJAX 从 PHP 获取数据并…

    2025年12月12日
    000
  • PHP与MySQL:精确筛选日期记录的实践与优化

    本文旨在解决php和mysql中查询今日特定日期记录时常见的逻辑错误。通过分析使用`>`操作符和完整日期时间字符串进行比较的局限性,文章将展示如何通过调整sql查询条件为`=`操作符,并确保php中日期格式仅包含年-月-日,从而实现精确筛选出指定日期的记录。同时,也将探讨处理`datetime…

    2025年12月12日
    000
  • 解决PHP对象循环引用导致构造器无限循环的策略:工厂方法与实例缓存

    当相互关联的对象在构造函数中彼此实例化时,容易陷入无限循环。本文探讨了这种循环依赖问题,并提出了一种优雅的解决方案:使用工厂方法结合实例缓存机制。通过将对象创建逻辑封装在静态工厂方法中,并维护一个已实例化对象的缓存,可以确保每个唯一id只对应一个对象实例,从而有效避免重复实例化和无限循环,同时优化资…

    2025年12月12日
    000
  • Laravel列表详情页动态加载:基于ID的数据传递与路由实现

    本教程详细阐述了在laravel应用中,如何实现点击列表项(如招聘信息)的“详情”按钮后,正确加载并显示对应详情页面的数据。核心方法是利用唯一标识符(如id)来传递特定数据请求,并结合laravel的路由系统或ajax技术实现数据的动态获取与展示。文章将提供基于路由模型绑定和ajax的两种实现方案,…

    2025年12月12日
    000
  • PHP框架怎么实现数据迁移_PHP框架数据库迁移文件生成与回滚

    答案:PHP数据库迁移通过代码管理结构变更,以Laravel为例,使用php artisan make:migration生成迁移文件,包含up()和down()方法定义变更与回滚逻辑;执行php artisan migrate应用未运行的迁移,按时间顺序更新数据库结构;通过php artisan …

    2025年12月12日
    000
  • Laravel日期验证:自定义规则中访问Request对象与年龄范围校验最佳实践

    本文深入探讨了在Laravel中进行复杂日期验证时遇到的常见问题,特别是自定义验证规则中`$request`变量未定义错误。文章详细介绍了如何利用全局辅助函数`request()`来解决此问题,并结合年龄范围校验提供了优化方案。此外,还强调了采用客户端日期选择器来提升用户体验和确保数据格式一致性的重…

    2025年12月12日
    000
  • Laravel 中如何按照指定 ID 顺序获取数据

    本文旨在解决 Laravel 中使用 whereIn 查询时,结果集顺序与传入 ID 数组顺序不一致的问题。通过 orderByRaw 方法,结合 FIELD 函数,实现按照指定 ID 顺序返回查询结果,确保数据按照预期顺序排列。 在使用 Laravel 的 Eloquent ORM 进行数据库查询…

    2025年12月12日
    000
  • 使用自定义函数包裹 WordPress 模板部件实现调试可视化

    本文旨在提供一种利用自定义函数包裹 `get_template_part()` 加载的 WordPress 模板部件,以便在调试过程中通过添加边框和颜色来可视化页面结构的方法。同时,文章也会讨论这种方法的潜在问题,并提醒开发者谨慎使用。 在 WordPress 主题开发过程中,get_templat…

    2025年12月12日
    000
  • PHP教程:在嵌套数组中高效查找特定字符串值

    本教程旨在指导php开发者如何在复杂的多层嵌套数组结构中,精准地检查某个特定字符串值(例如”diam-mm”)是否存在于数组元素的指定属性(如`propertytype`下的`name`)中。文章将通过示例代码详细演示如何遍历数组并进行条件判断,帮助您根据查找结果执行相应的业…

    2025年12月12日
    000
  • WordPress教程:在其他页面动态获取并显示首页特色图片

    本教程详细指导如何在WordPress自定义模板中,动态获取并展示网站首页的特色图片。通过识别首页ID、获取特色图片ID,并利用WordPress内置函数,您可以灵活地在任何页面(如“关于”页面)显示首页的精选图片,无论是输出完整的标签还是仅获取图片URL。 在WordPress网站开发中,尤其是在…

    2025年12月12日
    000
  • 解决PHP动态库加载失败:版本与架构不匹配问题

    本教程详细阐述了如何解决php启动时因动态库版本或cpu架构不匹配导致的加载失败警告,特别是针对yaf.so这类扩展。核心在于确保扩展文件与当前php版本及运行环境的cpu架构完全兼容,并正确配置php.ini文件中的extension和extension_dir设置,以保证php环境的稳定运行。 …

    2025年12月12日
    000
  • 利用PHP动态设置导航栏CSS类:实现页面专属样式

    本教程详细阐述了如何在php项目中,通过检测当前页面的文件名来动态地为导航栏元素添加不同的css类。文章介绍了使用`basename($_server[‘script_filename’])`获取当前脚本文件名的方法,并提供了多种实现策略,包括直接条件输出和更优化的变量赋值方…

    2025年12月12日
    000
  • php数据如何制作简单的聊天室_php数据WebSocket实时通信开发

    答案:使用PHP结合WebSocket实现聊天室需通过原生socket或第三方库建立全双工通信,替代低效的AJAX轮询。示例代码展示了基于PHP原生socket创建WebSocket服务器的过程,包括监听连接、握手协议、消息广播等核心逻辑,实现客户端间实时消息传递。 实现一个简单的聊天室,核心在于实…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信