怎么在Workerman中完美引入Yii2框架的组件和数据库连接?

千宇同学_5012

千宇同学_5012

2026-05-21

617人浏览

原创

正确做法是调用 init() 而非 run():加载 autoload、yii.php、bootstrap.php 和配置后,执行 (new yii\web\application($config))->init() 完成组件注册与别名初始化,避免依赖 http 生命周期的 run() 导致报错或卡死。

怎么在workerman中完美引入yii2框架的组件和数据库连接?

直接在Worker启动前加载Yii2初始化代码,但必须调用 init() 而非 run()

Workerman是常驻进程,不能像PHP-FPM那样每次请求都完整启动Yii2应用。强行调用 (new yii\web\Application($config))->run() 会报错或卡死,因为 run() 依赖HTTP请求生命周期(如 $_SERVER、响应输出等),而Workerman里没有这些上下文。

正确做法是只执行框架初始化阶段:载入自动加载器、Yii类、配置文件,然后调用 init() —— 它只注册组件、设置别名、初始化日志和事件,不启动请求循环。

  • 确保 require(__DIR__.'/../vendor/autoload.php') 和 require(__DIR__.'/../vendor/yiisoft/yii2/Yii.php') 已加载
  • 必须显式引入 bootstrap.php 文件(如 require(__DIR__.'/../common/config/bootstrap.php')),否则组件别名、行为等可能失效
  • $config 合并顺序要和Web入口一致,尤其注意 main-local.php 应在最后覆盖,避免敏感配置被线上值误覆盖
  • 调用 (new yii\web\Application($config))->init() 后,Yii::$app 就可用了,所有已注册组件(如 db、cache)都能直接取用

数据库连接必须启用 persistent,否则高并发下会快速耗尽MySQL连接数

Yii2默认的 yii\db\Connection 在每次 open() 时创建新连接,Workerman常驻特性会让连接长期持有却不释放——表面看没问题,但实际每个Worker子进程都会维持一套独立连接池,且不会自动复用或回收空闲连接。

不加 persistent => true 的后果:4个Worker进程 × 每个进程最多10个连接 = 40个MySQL连接被长期占用;若再开多个端口(如WebSocket + HTTP API),很容易触发 Too many connections 错误。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
  • 在 db 组件配置中明确添加 'persistent' => true
  • 同时建议设置 'attributes' => [PDO::ATTR_TIMEOUT => 5],防止网络异常导致连接卡死
  • 不要依赖 Yii::$app->db->close():Workerman里没“请求结束”概念,手动关连接反而可能导致后续查询失败
  • 验证是否生效:启动后执行 Yii::$app->db->getIsActive(),返回 true 即表示连接已建立且活跃

debug组件、request、response 等Web专属组件必须禁用或跳过加载

Workerman环境没有 $_GET、$_POST、HTTP头、输出缓冲等,任何依赖这些的组件在初始化时就会抛出异常。最典型的是 debug 和 log 中的 FileTarget(若路径不可写也会崩),还有 request 组件尝试读取 $_SERVER['REQUEST_URI'] 直接报 Undefined index。

  • 在合并配置前,从 $config 中 unset 掉 'debug'、'request'、'response'、'urlManager' 等键
  • 如果项目用了 log 组件,确保其 targets 不依赖Web上下文(例如避免 BrowserTarget),推荐只保留 FileTarget 或 SyslogTarget
  • 切勿在 bootstrap.php 中调用 Yii::setAlias('@web', ...) 这类基于URL的别名,Workerman里无“web根路径”概念
  • 若需记录调试信息,改用 file_put_contents('/tmp/workerman.log', ...) 或直接调用 Yii::info()(只要 log 组件本身能初始化)

全局状态共享是双刃剑:静态属性和单例在Worker内跨请求有效,但要注意线程安全

Workerman每个子进程内,所有请求共享同一份内存空间。这意味着 Yii::$app 是单例,static $counter = 0 在多次消息处理中会持续累加——这既是优势(比如缓存DB连接),也是隐患(比如未重置的状态污染后续请求)。

最容易被忽略的是:ActiveRecord模型里的静态缓存(如 findBySql 结果)、自定义静态属性、甚至第三方SDK内部的静态连接池,都可能在长连接场景下越积越多,最终OOM或返回脏数据。

  • 避免在模型类中使用 public static $cache = [] 存储业务数据;改用 Yii::$app->cache 并设合理过期时间
  • 如果必须用静态变量,务必在每次处理逻辑开头做清理(如 self::$tempData = [])
  • Redis/MySQL连接由Yii2组件管理即可,不用自己 new Client + static store;组件本身已处理复用与断线重连
  • 对关键共享资源(如共享内存、信号量),优先使用Workerman原生的 Worker::$connections 或 Timer,而非自行实现

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

yii workerman

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP Yii框架专题
PHP Yii框架专题

本专题专注于PHP主流框架Yii的应用,系统讲解MVC架构、路由机制、数据库操作、表单处理、安全验证与RESTful API 开发等核心内容。通过电商网站、后台管理系统与内容管理平台等实战项目,帮助学员快速掌握Yii框架的开发技巧与实战经验。

2025.09.04

2930

22

Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

166

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

202

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

187

13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

80

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

80

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

60

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习