0

0

Laravel Octane是什么?怎么用?

藏色散人

藏色散人

发布时间:2021-10-19 15:14:14

|

4402人浏览过

|

来源于learnku

转载

taylor otwell 已经在他的 laracon 在线演讲中展示了 laravel 最新的开源包 octane,新的包在 github 上可用,每个人都可以进行测试。

在这篇博客文章中,我们将探索 Laravel Octane,并告诉您它是什么,如果安装并使用它,以及您可能需要它的原因。【推荐学习:laravel教程

什么是 Laravel Octane?

Laravel Octane 是一个开源包,它可以提升你的 Laravel 应用性能。Laravel Octane 需要 PHP 8,如果您还在使用 7.x,您需要升级您的 PHP 版本。在底层,Octane 使用了 Swoole 和 RoadRunner 两个应用服务器,负责服务和启动你的 Laravel 程序。

对于通过像 nginx 这样的网络服务器提供服务的传统 PHP 应用程序,每个传入请求都会产生一个 PHP-FPM 工作器。这意味着每个请求都会启动一个单独的  PHP 进程,该进程运行所有的必要任务,以便为该请求提供服务。

在 Laravel 的情况下,这意味着需要启动框架,所有服务提供者在容器中注册他们的服务,所有提供者都自己启动,请求通过中间件类列表,命中您的控制器,呈现视图等。直到我们最终从我们的服务器得到响应。

使用 Swoole 或 RoadRunner 后,我们仍然为每个传入的 HTTP 请求提供一个工作线程,但它们都共享相同的引导框架。这意味着只有第一个传入请求将引导框架(包括所有服务提供者等)。而其他所有请求则可以使用现成的框架。这就是 Octane 如此之快的原因。

开始使用 Laravel Octane

由于 Laravel Octane 是一个包,因此您需要将它安装为特定应用程序的依赖项。您可以通过 composer 安装它:

composer require laravel/octane

在应用程序中安装 Octane 后,请确保运行 php artisan octane:install。这将发布 Octane 的配置文件,并将 rr - RoadRunner 二进制文件添加到 .gitignore 文件中。

正如我所说,Octane 将发布其配置文件,如下所示:

return [

    /*
    |--------------------------------------------------------------------------
    | Octane 服务器
    |--------------------------------------------------------------------------
    |
    | 该值决定了 Octane 在通过 CLI 启动、
    | 重启或停止服务器时将使用的默认 “服务器”。
    | 您可以随意将其更改为您选择的受支持服务器。
    |
    */

    'server' => env('OCTANE_SERVER', 'roadrunner'),

    /*
    |--------------------------------------------------------------------------
    | 强制 HTTPS
    |--------------------------------------------------------------------------
    |
    | 当该配置值设置为 “true” 时,
    | Octane 将通知框架必须使用 HTTPS 协议生成链接。
    | 否则,您的链接可能会使用普通 HTTP 生成。
    |
    */

    'https' => env('OCTANE_HTTPS', false),

    /*
    |--------------------------------------------------------------------------
    | Octane 监听器
    |--------------------------------------------------------------------------
    |
    | Octane 事件的所有事件监听器定义如下
    | 这些监听器负责为下一个请求重置应用程序的状态。
    | 您可以将自己的监听器添加到列表中。
    |
    */

    'listeners' => [
        WorkerStarting::class => [
            EnsureUploadedFilesAreValid::class,
        ],

        RequestReceived::class => [
            ...Octane::prepareApplicationForNextOperation(),
            ...Octane::prepareApplicationForNextRequest(),
            //
        ],

        RequestHandled::class => [
            //
        ],

        RequestTerminated::class => [
            //
        ],

        TaskReceived::class => [
            ...Octane::prepareApplicationForNextOperation(),
            //
        ],

        TickReceived::class => [
            ...Octane::prepareApplicationForNextOperation(),
            //
        ],

        OperationTerminated::class => [
            FlushTemporaryContainerInstances::class,
            // DisconnectFromDatabases::class,
            // CollectGarbage::class,
        ],

        WorkerErrorOccurred::class => [
            ReportException::class,
            StopWorkerIfNecessary::class,
        ],

        WorkerStopping::class => [
            //
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | 预热 / 刷新绑定
    |--------------------------------------------------------------------------
    |
    | 下面列出的绑定要么在工作进程启动时预热,
    | 要么在每次新请求之前刷新。
    | 刷新绑定将强制容器在被请求时再次解析该绑定。
    |
    */

    'warm' => [
        ...Octane::defaultServicesToWarm(),
    ],

    'flush' => [
        //
    ],

    /*
    |--------------------------------------------------------------------------
    | 垃圾收集阈值
    |--------------------------------------------------------------------------
    |
    | 在执行诸如 Octane 之类的长期存在的 PHP 脚本时,
    | 内存可能会在被 PHP 清除之前积累。
    | 如果您的应用程序消耗了此数量的兆字节,
    | 您可以强制 Octane 运行垃圾回收。
    |
    */

    'garbage' => 50,

    /*
    |--------------------------------------------------------------------------
    | 最长执行时间
    |--------------------------------------------------------------------------
    |
    | (提示) 0 表示没有最长时间限制
    |
    */

    'max_execution_time' => 30,

    /*
    |--------------------------------------------------------------------------
    | Octane 缓存表
    |--------------------------------------------------------------------------
    |
    | 在使用 Swoole 时,
    | 您可以利用由 Swoole 表提供支持的 Octane 缓存。
    | 您可以使用以下配置选项设置最大行数以及每行的字节数。
    |
    */

    'cache' => [
        'rows' => 1000,
        'bytes' => 10000,
    ],

    /*
    |--------------------------------------------------------------------------
    | Octane Swoole 表
    |--------------------------------------------------------------------------
    |
    | 在使用 Swoole 时,
    | 您可以根据应用程序的需要定义额外的表。
    | 这些表可用于存储特定 Swoole 服务器上其他工作人员需要快速访问的数据。
    |
    */

    'tables' => [
        'example:1000' => [
            'name' => 'string:1000',
            'votes' => 'int',
        ],
    ],];

接下来,你需要决定自己是使用 RoadRunner 还是 Swoole,然后,你可以通过自定义配置文件中的 server 键来配置要使用的应用程序服务器。这可以是 swooleroadrunner

RoadRunner

RoadRunner 是一个用 Go 编写的应用程序服务器,它在 PHP 本身没有任何其他依赖项。如果您不想安装额外的 PHP 扩展,请选择 RoadRunner。您可以通过 composer 安装 RoadRunner,如下所示:

composer require spiral/roadrunner

Swoole

Swoole 带来了 RoadRunner 无法提供的一些好处。由于 Swoole 是 PHP 之上的扩展,PHP 本身获得了一些很酷的新特性,如 “ticks” 和 “协程”,我将稍后介绍。RoadRunner 没有这些功能,所以如果你想使用它们,你应该使用 Swoole。

你可以使用以下方法安装 Swoole 扩展:

pecl install swoole

在安装过程中,系统会询问你是否希望在 Swoole 中支持 HTTP2, curl, JSON和 open_ssl。您可以安全地使用此处的默认值(即 off),因为这些设置只会影响协程之类的东西。

启动 Octane

一旦您安装了 RoadRunner 或 Swoole,并在您的 octane.php 配置文件中定义了它,您就可以启动 Octane 并让它为您的 Laravel 应用程序提供服务。

php artisan octane:start

默认情况下,Octane 将在端口 8000 上启动服务器,因为您可以通过 http://localhost:8000 在浏览器中访问您的应用程序。

继续,访问该路由并查看 Laravel 应用程序! 如果你发出了多个请求,将会看到第一个请求稍微慢一点,因为这是框架启动的地方,而其他请求则明显更快,因为它们可以从内存中使用启动后的框架。

200 GET / .............. 14.23 ms200 GET / ..............  1.93 ms200 GET / ..............  2.06 ms

更改代码

如果现在添加新的 /test 路由 - 并尝试访问,将收到 404 响应! 这是因为请求访问的是 Octane 服务内存中的框架(及其所有路由/代码)。 因此,为了查看代码更改,需要重启 Octane 服务。 这导致在开发过程中非常麻烦,所以 Octane 提供了一种很好的方式来自动监视代码库的更改并自动重启 Octane 服务。

为了完成这项工作,请确保安装 Chokidar - 基于 NodeJS 的文件监视库:

npm install --save-dev chokidar

然后,您可以在 “watch” 模式下启动 Octane 服务器,如下所示:

php artisan octane:start --watch

现在,下次您对代码库进行更改时,系统会检测到这一点,Octane 将为请求重启工作程序,您可以立即看到您的更改。

自定义 Workers

说到 Workers,默认情况下,Octane 将为您拥有的每个 CPU 内核启动一个 worker,但是您也可以改变这一点,通过 --workers 选项传递 octane:start 命令:

php artisan octane:start --workers=2

Swoole 特定功能

正如文中所提到的,Octane 带有一些 Swoole 特定的功能,我认为非常有趣,让我们来看看它们。

并发任务

Octane 可以同时执行多个任务。 它们会同时执行,并在所有任务完成后立即返回。

以下是 GitHub 上 Octane 文档中的一个示例:

use App\User;use App\Server;use Laravel\Octane\Facades\Octane;[$users, $servers] = Octane::concurrently([
    fn () => User::all(),
    fn () => Server::all(),]);

在这个例子中,我们同时获取所有用户和所有服务。 为了证明它们是同时执行,这是另一个例子:

Octane::concurrently([
        function () {
                sleep(0.5);
                return 1;
        },
        function () {
                sleep(1);
                return 2;
        },
    ]);

我们同时执行两个「任务」,一旦它们完成,PHP 将继续执行代码。 一个任务等待 0.5 秒,另一个任务等待 1 秒。 由于它们同时被执行,在两个单独的任务中,PHP 将等待 1 秒(不是 1.5 秒),直到两个结果都可用。 此功能是同时执行多个较小任务的绝佳方式。

就像 --workers 选项一样,您也可以自定义 Octane 提供 --task-workers 的数量。

Ticks / 间隔

Octane 与 Swoole 相结合,允许您注册 ticks - 这些操作将在给定的时间间隔内自动执行。类似 JavasScript 中的 setInterval 方法。不幸的是,目前无法停止这些 ticks,但您可以像这样在应用程序中注册它们:

Octane::tick('simple-ticker', fn () => ray('Ticking...'))
        ->seconds(10);

Octane 缓存

Octane 和 Swoole 中的另一个新功能是新缓存驱动程序。根据官方文档,此缓存驱动程序提供读与写速度高达每秒 200 万次操作。在幕后,Swoole 使用 Swoole 表 将数据缓存在共享内存中,所有 workers 都可以访问该表。当服务器重新启动时,缓存数据将被刷新,因为缓存仅保留在内存中。

要使用此缓存,您可以通过 Cache 门面的 otance 缓存存储访问它,如下所示:

Cache::store('octane')->put('framework', 'Laravel', 30);

另一个很酷的新增功能,即 Swoole 和 Octane 特有的是 “缓存间隔” 能力。这允许您将信息存储在 Octane 缓存中并在给定的时间间隔内刷新数据:

use Illuminate\Support\Str;Cache::store('octane')->interval('random', function () {
    return Str::random(10);}, seconds: 5)

Octane 表

基于 Swoole 表 的功能,您可以创建自己想要在 Octane 应用程序中访问的表。这些表具有与缓存相同的性能优势,允许您以结构化方式保存数据。请记住,当服务器重新启动时,您存储在此表中的所有数据都会丢失。

要配置表,您可以在 octane.php 配置文件中的 tables 部分创建一个条目:

'tables' => [
    'example:1000' => [
        'name' => 'string:1000',
        'votes' => 'int',
    ],],

在示例中,我们定义了一个名为 example 的表,该表最多可容纳 1.000 个条目/行。表的结构体是一个 name,它的最大长度为 1000 的字符串, 然而 votes,它是一个整数。

要把数据写入表中,我们可以使用 Octane::table 方法:

use Laravel\Octane\Facades\Octane;Octane::table('example')->set('a-unique-identifier', [
    'name' => 'Marcel Pociot',
    'votes' => 1000,]);

要取出数据,我们可以在表上使用 get 方法,如下所示:

return Octane::table('example')->get('a-unique-identifier');

Octane 的注意事项

当您想要为 Octane 准备现有应用程序或从开头开始构建新应用程序时,您需要注意几件事。

由于 Octane 将框架保存在所有 workers 的内存中,因此所有应用程序服务提供商之类的东西只会注册和启动一次。但 Octane 不可能重置您在自己的应用程序代码中可能具有的全局状态。

目前可以在 GitHub 上找到的官方文档包含一些您应该注意的最常见场景。

监听器

Octane 的一个尚未被记录的特性是:无论何时在Octane内的应用程序服务器中发生什么事情,都可以注册自定义监听器。您可以监听以下事件:

  • WorkerStarting
  • RequestReceived
  • RequestHandled
  • RequestTerminated
  • TaskReceived
  • TickReceived
  • OperationTerminated
  • WorkerErrorOccurred
  • WorkerStopping

要将监听器附加到这些事件,您可以将它们添加到您的 octane.php 配置文件中。

服务预热和刷新

当一个新的 Octane worker 启动时,您可以指定一个在启动过程中要「预热」的容器绑定 / 服务列表。这意味着,在 Worker 启动时,服务容器将已经使指定的服务可用,以便后续请求可以立即访问它们。

Octane 已经有一个内部服务列表,它会在每个工作程序启动过程中保持热加载,您也可以将自己的服务添加到 octane.php 配置文件中的 warm 部分。

与此类似,您还可以在新请求进入之前定义要刷新的服务列表。这对于在请求过程中被操纵的服务很有用,当新请求进入时,您希望将其重置为原始/卸载状态。

Octane 路由

如果 Octane 没有给您提升足够的速度,您可以通过 Octane 内置的路由来进一步提高速度。您可以通过 Octane 自定义路由,如下所示:

Octane::route('GET', '/fast', function() {});

这些路由非常快,因为它们完全跳过了 Laravel 的路由系统(因此这些路由不提供任何类型的中间件)— 这对只需要快速提供数据的端点很有帮助。

由于 Laravel     中的 HTTP 内核未用于这些请求,您需要自己返回一个 Symfony Response 对象,如下所示:

use Symfony\Component\HttpFoundation\Response;Octane::route('GET', '/faster', function() {
    return new Response('Hello from Octane.');});

当然,所有服务提供者都已启动且可用,因此您仍然可以使用这些服务执行 Eloquent 查询等。

好吧…那为什么是 Octane?

Laravel Octane 肯定会给您的 Laravel 应用程序带来巨大的性能提升 — 我们都喜欢性能提升,不是吗?我们真的需要这种性能提升吗?好吧,也许 — 我认为这取决于您正在运行的应用程序。但对我来说更重要的是 Laravel 正在(再次)推动 PHP 的当前状态。Octane 不仅是一个至少需要 PHP 8 的包,并且它还在 PHP 世界中推出了令人兴奋的新功能,例如协程、ticks,以及使用 artisan 命令服务您应用程序的思维模式。

我为 Octane 的未来感到兴奋!


原文地址:https://beyondco.de/blog/laravel-octane-introduction

译文地址:https://learnku.com/laravel/t/61524

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

2

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

481

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

156

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

296

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

10

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

13

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

10

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

25

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

125

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号