
Laravel Spawn 是基于 PHP TrueAsync 的 Laravel 异步运行时。它在一个单个 worker 内,通过隔离的协程并发运行多个请求,在消除共享状态问题的同时,提供高性能,且无需线程或进程开销。
Laravel 适配器,用于 PHP TrueAsync —— 一个带有原生协程调度器和异步 I/O 的 PHP 分支。 可以把它想象成 Laravel Octane,但底层运行时不是 Swoole 或 RoadRunner,而是 TrueAsync。
一个 worker。多个请求。零线程。 每个 HTTP 请求都在自己的协程中运行,拥有独立的隔离状态 —— 无共享内存,请求之间不会发生状态泄漏。
auth、session、cookie 等)通过 coroutine_context() 实现隔离trueasync/php-true-async:latest-frankenphp Docker 镜像composer require yangusik/laravel-spawn
通过 Git 仓库安装:
"repositories": [
{
"type": "vcs",
"url": "https://github.com/yangusik/laravel-spawn"
}
],
"require": {
"yangusik/laravel-spawn": "dev-master"
}
通过本地路径安装:
"repositories": [
{
"type": "path",
"url": "../laravel-true-async"
}
],
"require": {
"yangusik/laravel-spawn": "*"
}
然后执行:
composer update
Laravel 会自动发现该包的服务提供者。
在 bootstrap/app.php 中替换 Application 类:
- $app = new Illuminate\Foundation\Application(
+ $app = new Spawn\Laravel\Foundation\AsyncApplication(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
这一步是必须的,用于实现 auth、session 和 request 等服务的每协程隔离。如果不替换,虽然服务适配器能正常注册,但状态隔离将无法生效。
发布配置文件:
php artisan vendor:publish --tag=async-config
简单的 TCP Socket 服务器,适合本地开发,类似于 php artisan serve。
php artisan async:serve --host=0.0.0.0 --port=8080
基于 FrankenPHP 的生产就绪适配器,以异步 worker 模式运行。
需要使用 trueasync/php-true-async:latest-frankenphp Docker 镜像。
php artisan async:franken --host=0.0.0.0 --port=8080 --workers=1 --buffer=1
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
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:
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),
],
];
负载: 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... | - | - |