什么是 Octane
Laravel Octane 是一个通过高性能应用服务器让 Laravel 应用性能大幅提升的扩展包。 在传统的 PHP-FPM 下,每个请求都会启动并销毁一次应用。Octane 只启动应用一次并常驻在内存中,用来极快地处理后续请求。 与 PHP-FPM 最大的差别在于,服务提供者注册、Bootstrap 等启动逻辑不会在每个请求中重复执行。启动一次后,后续的请求都能以极快的速度处理。支持的服务器
Octane 支持以下三种服务器。在 Laravel Cloud 上推荐使用 FrankenPHP 运行 Octane,完全托管。
安装与配置
安装扩展包
Octane 初始化
config/octane.php。
FrankenPHP
选择 FrankenPHP 后,Octane 会自动下载二进制。无需额外操作。RoadRunner
选择 RoadRunner 后,Octane 会自动下载二进制。Swoole
Swoole 是 PHP 扩展,通过 PECL 安装。启动方式
启动服务器
8000 端口。访问 http://localhost:8000 即可。
指定服务器
指定 worker 数
监听文件变化
开发时如果不重启服务器,文件更改不会生效。加上--watch 参数可以自动重启。
其他管理命令
依赖注入的注意事项
Octane 将应用常驻内存,所以服务提供者的register 和 boot 只在服务器启动时执行一次。同一个应用实例会在多次请求间被复用,因此把容器或请求注入到对象的构造函数中需要格外小心。
注入容器
如果直接把容器注入到单例的构造函数,会一直复用旧容器。app() 和 Container::getInstance() 始终返回最新容器,是安全的。
注入请求
在控制器方法或路由闭包中用类型提示注入
Illuminate\Http\Request 是安全的。全局辅助函数 request() 也始终返回当前请求。注入配置仓库
config() 始终返回最新的配置仓库,是安全的。
应对内存泄漏
由于 Octane 会把应用保持在内存中,向静态属性等地方持续累积数据会导致内存泄漏。通过 max-requests 回收 worker
worker 处理一定次数请求后自动重启,可以缓解内存泄漏。默认是 500 次。设置最大执行时间
config/octane.php 中可以设置单个请求的最大执行时间,默认是 30 秒。
并发任务(仅限 Swoole)
在使用 Swoole 时,可以通过Octane::concurrently() 并发执行多个任务。
--task-workers 指定。
Tick 与 Interval(仅限 Swoole)
Swoole 下可以注册按指定间隔定期执行的任务。在服务提供者的boot 方法中注册。
Octane 缓存(仅限 Swoole)
基于 Swoole 的 Swoole Table 的高速内存缓存,每秒可完成最多 200 万次读写。Interval 缓存
按指定时间间隔自动刷新的缓存。Swoole 表(仅限 Swoole)
你可以定义任意 worker 都可访问的共享内存表。在config/octane.php 的 tables 中配置。
Octane::table() 方法访问表。
生产环境部署
Nginx + Octane 架构
生产环境通常在 Nginx 后面运行 Octane。Nginx 负责静态资源和 SSL 终端,把动态请求代理给 Octane。使用 Supervisor 常驻
在生产环境用 Supervisor 让 Octane 常驻运行。启用 HTTPS
若要让 Octane 生成 HTTPS 链接,请在.env 中设置:
与 Laravel Cloud 结合
Laravel Cloud 完全托管地支持 FrankenPHP 版 Octane。无需配置 Nginx 或 Supervisor,只需两步即可启用 Octane。1
安装扩展包
安装 Octane。
octane:install 命令可以执行,但不是必需的。2
在 Laravel Cloud 中启用 Octane
打开环境的 App 计算集群设置,打开 “Use Octane as runtime” 保存并部署即可。Laravel Cloud 会自动使用 FrankenPHP + Octane 构建并启动应用。