首页
Preview

使用 Laravel Octane 的缺点

Laravel Octane在几周前被宣布,承诺在每秒请求服务方面将框架推向月球。今天(以beta形式)对所有人进行测试,可直接使用一方Laravel包(例如NovaTelescope)。

Laravel Octane推动边界的方式基本上很简单:它不是在每个请求中“启动”应用程序,而是完全启动一次并将其保存到内存的共享部分。完成后,Octane将生成多个PHP工作进程,这些进程将接收此共享应用程序实例。这些进程不仅处理一个请求,而是同时处理多个请求。

正如你们中的许多人所知,PHP本质上是一个单线程进程,即使在PHP Fibers到来之后仍然如此。Laravel Octane不使用PHP Fibers,而是在自定义HTTP服务器下运行应用程序,对PHP进行更严格的控制。对于后者,需要RoadrunnerSwoole

惊人的性能确实伴随着一些代码警告

一种实例统治所有

如果你已经发现了问题,那么你很棒。但对于那些仍然迷失的人,这是一个非常简化的版本:

显示Laravel Octane工作方式的图表

Laravel Octane工作方式的非专业且简化的示例

当服务器启动时,应用程序通过注册和启动所有服务(甚至是标记为“deferred”的服务,我们称之为“引导”)来启动。然后,将此新实例共享到所有PHP工作进程中。这与普通PHP进程的工作方式相反。通常,每次请求进入并且响应退出时,应用程序会引导并被销毁。

我将引用这篇优秀且详尽的Diving Laravel文章,介绍Laravel Octane的工作方式-特别是如何处理应用程序和服务单例-这将立即清除你的头脑:

“容器中的绑定可以注册为单例,这些特殊的绑定仅在应用程序生命周期中解析一次。已解析的实例将存储在容器缓存中,并且在应用程序的生命周期内将重复使用相同的实例。

(...) 通过调用 $app->resolve('singleton')$app->make('singleton') 来解析实例。因此,如果你在服务提供者的 bootregister 方法中解析任何单例,这些单例将持久存在。在处理请求时解析的单例将不会持久存在,当在Octane下运行时,它们将在每个请求时构造。你不需要担心那些。”

由于应用程序已经启动,因此应用程序在爆炸速度下工作,因为无需再次启动。现在,想象一下恶作剧:一个服务单例将为任何人的所有请求保留相同的数据!这也适用于配置存储库和容器本身。胡说!

如果要破坏Laravel Octane,你甚至可以通过为每个请求将数据堆积到Class静态属性中来进行简单的内存泄漏。

编写考虑Laravel Octane的代码

现在你知道它是如何工作的了,很容易理解应用程序在所有请求中在所有方面_基本上_是相同的。在引导过程中全局更改状态将反弹到所有请求,而在引导过程之外,它仅适用于当前请求。应用程序在请求结束后不会死亡,而是立即为进入服务器的下一个请求提供服务。

有了这个想法,如果你计划创建一个使用Laravel Octane创建应用程序或承诺相同功能的软件包,这里是我的建议:# 结论

虽然 Laravel Octane 没有任何破坏性,但作为开发人员,你需要仔细检查你的依赖项是否与 Laravel Octane 不兼容,特别是那些涉及许多单例的依赖项。

我认为告诉开发人员你的代码已经经过修改,以便以非破坏性的方式与 Laravel Octane 一起工作是方便的。我甚至将我的存储库标记为“Laravel Octane 兼容”,这样人们就可以更快、更安全地跳入其中。

总结

  • 如果你希望单例只解析一次并在请求期间保持不变,则可以安全地注册单例。
  • 如果你希望从中获得不可变性,则可以安全地注入配置。
  • 可以安全地注入容器以解析在引导时注册的服务,但不能添加或修改容器内部的内容并期望其持久存在。
  • 尽量在控制器之外使用 request()
  • 永远不要使用静态属性。尽可能使用常量。

简而言之,引导时的应用程序状态与请求时的应用程序实例不同。此外,单例不应直接与请求相关联。

对于其他方面,Laravel Octane 不是必需的,因为许多应用程序瓶颈都与未优化的数据库查询、缓慢的会话存储或缓慢的外部 API 请求有关。与往常一样,基准测试你的应用程序以检查缓慢的原因,因为 Laravel Octane 可能只会给你带来更多的麻烦而不是解决方案。

Laravel Octane logo

[Laravel Octane Compatible

译自:https://betterprogramming.pub/the-downsides-of-coding-with-laravel-octane-17f4a7a4ea85

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
anko
宽以待人处事,严于律己修身。

评论(0)

添加评论