首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于 PHP TrueAsync 的 Laravel 异步运行时 Spawn

基于 PHP TrueAsync 的 Laravel 异步运行时 Spawn

作者头像
Tinywan
发布2026-07-01 16:36:31
发布2026-07-01 16:36:31
70
举报
文章被收录于专栏:开源技术小栈开源技术小栈

概述

Laravel Spawn 是基于 PHP TrueAsync 的 Laravel 异步运行时。它在一个单个 worker 内,通过隔离的协程并发运行多个请求,在消除共享状态问题的同时,提供高性能,且无需线程或进程开销。

Laravel 适配器,用于 PHP TrueAsync —— 一个带有原生协程调度器和异步 I/O 的 PHP 分支。 可以把它想象成 Laravel Octane,但底层运行时不是 Swoole 或 RoadRunner,而是 TrueAsync

一个 worker。多个请求。零线程。 每个 HTTP 请求都在自己的协程中运行,拥有独立的隔离状态 —— 无共享内存,请求之间不会发生状态泄漏。

工作原理

  • 每个请求 = 一个独立的协程,拥有自己的 Scope
  • 请求作用域的服务(authsessioncookie 等)通过 coroutine_context() 实现隔离
  • PDO 连接池会透明地为每个协程提供独立的数据库连接,并在协程结束时自动归还
  • 无需克隆容器 —— 隔离在协程层面处理,而不是通过复制整个应用实现

要求

  • PHP TrueAsync 分支 8.6+
  • Laravel 12+
  • 使用 FrankenPHP 模式时:需要 trueasync/php-true-async:latest-frankenphp Docker 镜像

安装

代码语言:javascript
复制
composer require yangusik/laravel-spawn

通过 Git 仓库安装:

代码语言:javascript
复制
"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/yangusik/laravel-spawn"
    }
],
"require": {
    "yangusik/laravel-spawn": "dev-master"
}

通过本地路径安装:

代码语言:javascript
复制
"repositories": [
    {
        "type": "path",
        "url": "../laravel-true-async"
    }
],
"require": {
    "yangusik/laravel-spawn": "*"
}

然后执行:

代码语言:javascript
复制
composer update

Laravel 会自动发现该包的服务提供者。

bootstrap/app.php 中替换 Application 类:

代码语言:javascript
复制
- $app = new Illuminate\Foundation\Application(
+ $app = new Spawn\Laravel\Foundation\AsyncApplication(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

这一步是必须的,用于实现 authsessionrequest 等服务的每协程隔离。如果不替换,虽然服务适配器能正常注册,但状态隔离将无法生效。

发布配置文件:

代码语言:javascript
复制
php artisan vendor:publish --tag=async-config

支持的服务器

1. 开发服务器(Dev Server)

简单的 TCP Socket 服务器,适合本地开发,类似于 php artisan serve

代码语言:javascript
复制
php artisan async:serve --host=0.0.0.0 --port=8080

2. FrankenPHP(生产推荐)

基于 FrankenPHP 的生产就绪适配器,以异步 worker 模式运行。 需要使用 trueasync/php-true-async:latest-frankenphp Docker 镜像。

代码语言:javascript
复制
php artisan async:franken --host=0.0.0.0 --port=8080 --workers=1 --buffer=1

Docker 快速启动

开发服务器(无需 FrankenPHP)

代码语言:javascript
复制
services:
  app:
    image:trueasync/php-true-async:latest
    working_dir:/app
    command:phpartisanasync:serve--host=0.0.0.0--port=8080
    ports:
      -"8080:8080"
    volumes:
      -.:/app
    environment:
      APP_ENV:local
      DB_CONNECTION:pgsql
      DB_HOST:db
      DB_PORT:5432
      DB_DATABASE:laravel
      DB_USERNAME:laravel
      DB_PASSWORD:secret

FrankenPHP 模式

代码语言:javascript
复制
services:
  app:
    image:trueasync/php-true-async:latest-frankenphp
    working_dir:/app
    command:phpartisanasync:franken--host=0.0.0.0--port=8080--workers=1--buffer=1
    ports:
      -"8080:8080"
    volumes:
      -.:/app
    environment:
      APP_ENV:local
      DB_CONNECTION:pgsql
      DB_HOST:db
      DB_PORT:5432
      DB_DATABASE:laravel
      DB_USERNAME:laravel
      DB_PASSWORD:secret

配置

配置文件位于 config/async.php

代码语言:javascript
复制
return [
    'db_pool' => [
        'enabled'              => env('ASYNC_DB_POOL_ENABLED', true),
        'min'                  => env('ASYNC_DB_POOL_MIN', 2),
        'max'                  => env('ASYNC_DB_POOL_MAX', 10),
        'healthcheck_interval' => env('ASYNC_DB_POOL_HEALTHCHECK', 30),
    ],
];

性能基准测试(Benchmarks)

负载: 840 req/s /hello + 360 req/s /test = 总计 1200 req/s 测试方式:constant-arrival-rate · 30秒 · 每种场景 12 个 worker · WSL2 (Linux 6.6 on Windows)

指标

PHP-FPM (12w)

Octane Swoole (12w)

TrueAsync (12w)

目标速率

1200 req/s

1200 req/s

1200 req/s

实际吞吐量

~200 req/s

~752 req/s

~1118 req/s

丢弃的迭代次数

~28...

-

-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 工作原理
  • 要求
  • 安装
  • 支持的服务器
    • 1. 开发服务器(Dev Server)
    • 2. FrankenPHP(生产推荐)
  • Docker 快速启动
    • 开发服务器(无需 FrankenPHP)
    • FrankenPHP 模式
  • 配置
  • 性能基准测试(Benchmarks)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档