近年来,Laravel 获得了很多关注,尽管它一直是小型 Web 应用产品所有者眼中的魅力所在。然而,使用 Laravel 开发大型应用程序似乎仍然是一个难题。在这篇博文中,我们介绍了 Laravel 框架的最新成员 Laravel Octane,以及 Octane 扩展 Laravel 应用程序在市场上引起的轰动,以填补产品所有者体验到的 Laravel 可扩展性差距

介绍

Laravel 拥有简单而体面的语法,使开发人员可以更轻松地开发 Web 应用程序。导致 Laravel 在各个方面都缺乏的唯一缺点是可扩展性,这就是为什么 Laravel 不是开发人员最喜欢的语言之一。在引入 Octane 之后,这种看法略微转向 Laravel 及其社区。但是,在我们转到 Octane 到 Laravel 应用程序的主题之前。让我们首先了解Laravel Octane是什么以及它是如何工作的。

什么是 Laravel Octane?

Laravel Octane是 Taylor Otwell 在他的 Laracon Online Talk 中介绍的开源包,发布日期为 2021 年 5 月 12 日。该包服务于 Laravel 应用程序,并使用 Web 服务器 Swoole 和 RoadRunner 来帮助提高性能。它由第一个请求初始化,存储在内存中,并且不会在后续请求时重新初始化。它在 GitHub 上拥有 3.3k Stars 和 234 Forks。

Octane的主要特点

Octane 的关键特性包括几个特性,使其能够呈现比传统 Laravel 更好的性能;下面给出了一些这样的功能:

  • 它使您的应用程序极其快速和高效
  • 与传统的 Laravel 应用程序相比,它节省了资源。

Laravel Octane 是如何工作的?

Octane Laravel 建立在传统的 Laravel 和 PHP 8.0 及以上版本之上。它不是一种单独的语言,而是对标准 Laravel 的补充。Octane 通过 Swoole 和 RoadRunner 在其服务器上运行,传统的 ApacheNginx 应该重定向传入流量。

Octane Open Swoole

它是一个软件开发工具包,允许产品所有者创建高效且可扩展的 Web 应用程序。Open Swoole 是 Swoole 框架的一个分支,于 2021 年底发起,涉及 swoole 开发者社区内部的冲突。

Octane Roadrunner

它是一种开源、高性能、可维护的 PHP 应用程序服务器,可以有效且高效地替代传统的 Nginx 设置,从而提供更好的性能和灵活性。

我们还可以提到,尽管 Swoole 和 RoadRunner 仍然为所有请求使用工作进程,但它们仅服务于启动框架(依赖容器)的第一个请求,其余请求来自框架的引导版本。这共同使您的应用程序的执行速度比现有应用程序快得多。

辛烷走鹃

Octane Laravel 在第一个请求时在 RAM 中捕获引导的 Laravel 框架。之后,所有请求都使用已经从 RAM 引导的框架,而不是从硬盘读取文件并重新引导框架,从而使 Laravel 应用程序更快,并在很大程度上提高了其性能。

Laravel 与 Apache 对比 Laravel Octane 基准测试

按照 Laravel 的创建者 Taylor Otwell 的说法,在引入 Apache 和 Octane 之后,几乎没有要求为新项目选择 Lumen。正如我们所知,Lumen 是一个基于 Laravel 的微框架,有意去除了一些组件,以使其运行速度更快。此外,使用 Laravel Octane 作为其服务器是比 Lumen 更快更好的选择。为了更好地理解这一点,让我们看一些基准。

在这个基准测试中,我们总共采用了三种模式 Laravel Octane vs Laravel Apache Web Server vs Laravel built-in server:

  • Laravel 与 Octane
  • Laravel 与 Apache Web 服务器
  • Laravel 及其内置服务器。

在此基准测试中,我们使用了具有以下配置的工具 wrk:

wrk -tl -c50 URL

第一次验证是在 Just Hello World HTML 上执行的,我们收到的结果如下:

模式 请求在 10 秒内处理 每秒请求数 (RPS)
Laravel 与 Octane 2667 266转/秒
Laravel 与 Apache 1210 121转/秒
Laravel 及其内置服务器 705 70 转/秒

这些 Laravel Octane 基准测试指标足以让您了解 Octane Laravel 在性能方面比传统的 Apache-Server Laravel 快得多。

为什么要使用 Octane 扩展您的 Laravel 应用程序?

Octane 在内存中捕获你的数据和对象,这有助于将 Laravel 应用程序的性能提高多达 30%。由于消除了磁盘读取、进程分叉和各种其他开销,每当框架根据每个请求启动时,都会出现这种性能改进,这允许 Laravel 应用程序快速管理数千个连接,从而有助于增加流量或需要高可用性。此外,这也是一种花费很少的高效方法。

此外,在某些情况下,需要对代码库进行微小更改或无需更改。但这与您的应用程序的结构有关。

使用 Octane 扩展 Laravel 应用程序之前需要注意什么(先决条件)

Octane 可以在很大程度上提高您的 Web 应用程序开发性能,但这并不意味着它有足够的能力提高您的 Web 应用程序的性能并为您提供扩展的自由。

它涉及 PHP 8.0 版和采用有状态编程约定等先决条件。因此,在您最终使用 Octane 之前,第一步也是最重要的一步是更新您的 PHP 版本并安装它。虽然这看起来是一项简单的任务,但严重的问题是许多在 Laravel 上运行的网站使用的是旧版本的 Laravel,它不支持 Octane,因此需要使用最新的 Laravel 版本进行更新。

此外,许多产品所有者,无论是有经验的还是新手,都不熟悉有状态框架,这再次需要努力去理解它,然后才能最终在您的 Web 应用程序中实施 Laravel Octane 以进行扩展。

其他必要因素

除了上面给出的先决条件之外,还必须考虑一些其他因素来制作可扩展的 Web 应用程序。让我们看看下面给出的那些因素:

重构的意义

对于使用会话状态或一些中间件类型的应用程序,需要先对代码进行一些更改才能使用 Octane。此外,您应该添加对基于 Swoole 协程的会话的支持,并删除与 Swoole 不兼容的中间件。

需要进行的其余更改涉及依赖注入容器。你可以参考 Laravel的 Laravel 官方文档了解更多关于 How to do 的信息。

处理代码更改

传统的 Laravel 要求您在进行任何更改时启动或停止整个 Laravel 应用程序实例。然而,与此相反,使用 Octane,您可以方便地自动监控代码库并重新启动 Octane 服务器,而无需任何手动干预,这使您可以通过在单个实例或一个地方更改代码来轻松进行开发每次更新代码库时都需要重新启动整个应用程序实例。

是否有任何其他选项来扩展 Laravel 应用程序?

是的,问题总是有另一种解决方案。虽然 Laravel Octane 是解决传统 Laravel 应用程序扩展问题的好工具,但它仍然不是唯一的选择;许多其他选项可以满足您的扩展需求。让我们来看看其中的一些:

水平缩放

首先是水平扩展,这是一种简单但最不推荐的扩展 Laravel 应用程序的方法。这背后的原因是,虽然它是高效的,但随着运行成本的不断增加,它变得越来越复杂和昂贵,并且随着您迁移到不同的服务器变得越来越困难。此外,它仍然是一个有限的解决方案,因为您无法使用此设置按需扩展。

负载均衡(使用 AWS 或不使用 AWS)

为了在 AWS 上扩展你的Laravel 应用程序,你可以自动将应用程序扩展到一个有限的范围,以适应具有相同 MySQL 数据库的应用程序。这些服务器此后使用单个 Amazon RDS 或 Amazon Relational Database。

尽管与水平扩展相比,这似乎是一个可行的扩展选项,但此处涉及的隐性成本并不透明。此外,它不如 Octane Laravel 有效。不过,重要的好处是它允许你在不需要对现有代码库进行任何更改的情况下进行扩展,就像 Laravel Octane 一样。

Laravel Vapor 和 Octane

Laravel Vapor 是 Laravel 的自动扩展、无服务器部署平台。Vapor 允许无服务器的可扩展性和简单性。当与 Octane 结合使用时,Laravel Octane Vapor组合可在任何规模下提供自动缩放和更快的加载时间。然而,为了更好地理解它,让我们从 Laravel 官方文档中举一个例子。

亚马逊 us-west-1 区域的 Vapor 项目。此 Vapor 应用程序配置有 1 GB RAM 和一个 RDS MySQL 实例 (db.t2.micro),具有 1 个 VCPU 和 1Gib RAM。

现在,查看从数据库获取用户的 API 端点。借助 Octane,其端点速度提高了 7 倍。它使用的内存减少了 44%:

在 Vapor 的 Octane 集成之前

Time Taken by Request: 39.40 ms, Memory Usage: 169 MB
Time Taken by Request: 40.20 ms, Memory Usage: 169 MB
Time Taken by Request: 37.71 ms, Memory Usage: 169 MB
Time Taken by Request: 42.16 ms, Memory Usage: 169 MB
Time Taken by Request: 40.60 ms, Memory Usage: 169 MB
Time Taken by Request: 45.75 ms, Memory Usage: 169 MB

Vapor 的 Octane 整合后

Time Taken by Request: 6.78 ms, Memory Usage: 112 MB
Time Taken by Request: 6.64 ms, Memory Usage: 112 MB
Time Taken by Request: 6.67 ms, Memory Usage: 112 MB
Time Taken by Request: 6.38 ms, Memory Usage: 112 MB
Time Taken by Request: 6.75 ms, Memory Usage: 112 MB
Time Taken by Request: 6.47 ms, Memory Usage: 112 MB

而呈现静态模板的“登录”路由。此端点的 Octane 使其快了近 3 倍。它使用的内存减少了 35%:

在 Vapor 的 Octane 集成之前

Time Taken by Request: 11.32 ms, Memory Usage: 165 MB
Time Taken by Request: 11.35 ms, Memory Usage: 165 MB
Time Taken by Request: 11.29 ms, Memory Usage: 165 MB
Time Taken by Request: 11.29 ms, Memory Usage: 165 MB
Time Taken by Request: 11.36 ms, Memory Usage: 165 MB
Time Taken by Request: 11.43 ms, Memory Usage: 165 MB

Vapor 的 Octane 整合后

Time Taken by Request: 4.89 ms, Memory Usage: 108 MB
Time Taken by Request: 4.89 ms, Memory Usage: 108 MB
Time Taken by Request: 4.83 ms, Memory Usage: 108 MB
Time Taken by Request: 4.66 ms, Memory Usage: 108 MB
Time Taken by Request: 4.79 ms, Memory Usage: 108 MB
Time Taken by Request: 4.91 ms, Memory Usage: 108 MB

因此,我们可以推断 Octane 减少了请求的持续时间以及内存使用。此外,添加 AWS 在 Lambda 上应用 1ms 计费粒度,因此您需要为 HTTP 功能支付相对较少的费用。因此,Laravel Octane Vapor 的组合是制作具有可扩展性的 Laravel Octane Vapor Web 应用程序的绝佳选择。

结论

这就是我们使用 Laravel Octane 扩展 Laravel 应用程序的内容。虽然它是扩展现有 Laravel 应用程序的一个不错的选择,但与传统的 Laravel 应用程序相比,它在性能方面显示出显着的改进。尽管如此,它与许多传统 Laravel 应用程序的现有代码库不兼容仍然是一个挫折。如果您希望提高应用程序的性能,它可能是一个不错的选择,但如果您打算挽救一个已经苦苦挣扎的应用程序,那么 Octane Laravel 并不是最佳选择。在做出最后决定之前,您必须进行彻底的研究。

此外,当您选择了 Octane 时,如果您仍然对进行最终调用或扩展 Laravel 应用程序犹豫不决,请确保使用您添加到项目中的 Octane Compatible 包以获得与 Octane 兼容的理想应用程序。像 Bacancy 这样的Laravel 开发公司可以在这方面为您提供帮助;我们的专业人士随时可以指导您并与您一起完成整个 Web 应用程序开发过程。

关于为什么你应该使用 Laravel Octane 来扩展你的应用程序的快速指南
标签: