workerman 5.2.3 可与 laravel 稳定集成,但不兼容其请求生命周期和 ioc 容器自动注入——需手动引导 laravel 应用实例才能使用 eloquent、mail 等服务。

Workerman 5.2.3 可以与 Laravel 稳定集成,但需注意它**不兼容 Laravel 的请求生命周期和 IoC 容器自动注入机制**——Workerman 是独立运行的常驻进程,绕过了 Laravel 的 HTTP 请求栈。因此,不能直接在 Worker 回调里用 app() 或 resolve() 获取 Laravel 服务(如 Eloquent、Mail、Redis),除非手动引导 Laravel 应用实例。
安装与基础启动
在 Laravel 项目根目录执行:
-
composer require workerman/workerman:^5.2.3(确保 Composer 使用 PHP 8.1+) - 创建 Artisan 命令:
php artisan make:command WorkermanServer - 在
app/Console/Commands/WorkermanServer.php中初始化 Worker,注意:Laravel 5.8+ 推荐使用bootstrap/app.php手动启动应用,而非依赖全局require autoload.php
在 Worker 中安全使用 Laravel 功能
必须显式启动 Laravel 应用并绑定到当前进程上下文,否则模型、配置、数据库连接等均不可用:
- 在
handle()方法开头添加 Laravel 引导逻辑(示例):
use Workerman\Worker;
$app = require __DIR__.'/../../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')
->bootstrap();
$ws = new Worker('websocket://0.0.0.0:2346');
$ws->onMessage = function ($conn, $data) use ($app) {
// ✅ 此时可安全使用 Laravel 服务
$user = $app->make('App\Models\User')::find(1);
$conn->send($user ? 'Hello '.$user->name : 'Not found');
};
Worker::runAll();
进程管理与命令支持
Workerman 5.2.3 支持 start/stop/restart/status,但 Laravel 的 Artisan 命令需透传参数:
- 签名设为
workerman:server {action} {--d} - 在
handle()中重写$argv数组,让 Workerman 识别命令(否则会误认artisan为脚本名) - 添加守护模式判断:
$argv[2] = $this->option('d') ? '-d' : '';
关键注意事项
-
不要在
onConnect/onMessage中新建 Laravel 应用实例——应复用已 bootstrapped 的$app实例,避免重复加载、内存泄漏 -
数据库连接需手动处理长连接失效:Workerman 进程常驻,PDO 连接可能超时,建议在每次使用前检查或启用
PDO::ATTR_EMULATE_PREPARES+ 重连逻辑 -
日志统一走 Laravel 日志通道:用
$app['log']->info(...)替代echo或var_dump -
环境变量需显式加载:Workerman 不读取
.env,需在命令中Dotenv\Dotenv::createImmutable(base_path())->load();











