Workerman怎么配置全局异常捕获?防止进程崩溃

落枫大大_5208

落枫大大_5208

2026-05-26

1033人浏览

原创

Workerman防崩溃靠多层兜底+主进程自动拉起,而非全局异常捕获;需在start.php顶部设set_exception_handler和set_error_handler统一处理,配合Worker::onError、正确daemonize及ulimit配置。

workerman怎么配置全局异常捕获?防止进程崩溃

Workerman 本身不提供“全局异常捕获后继续运行”的魔法能力——set_exception_handler 只能记录日志、做清理,无法阻止进程退出;真正防崩溃靠的是多层兜底 + 主进程自动拉起机制。

为什么 onWorkerStart / onMessage 里 throw 了就崩?

PHP 的 Fatal error(如调用未定义函数、内存耗尽、类未找到)和未捕获的 Exception/Error 会直接终止当前 worker 进程。Workerman 不会自动 catch 所有代码路径,尤其以下情况极易触发崩溃:

  • onWorkerStart 中加载配置失败、连接 Redis 失败且没 try-catch
  • onMessage 里执行 json_decode($malformed) 后直接用结果,没检查 null
  • 协程中用了 sleep() 或阻塞 IO(Workerman 不是 Swoole,不支持原生协程)

必须设置 set_exception_handler + set_error_handler

这两者要放在 start.php 最顶部(早于 Worker::runAll()),确保覆盖所有 worker 进程:

set_exception_handler(function (Throwable $e) {
    error_log('[FATAL] Uncaught exception: ' . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine());
    // 注意:这里不能 return 或 throw,进程仍将退出
});

set_error_handler(function ($severity, $message, $file, $line) {
    if (!(error_reporting() & $severity)) {
        return;
    }
    throw new ErrorException($message, 0, $severity, $file, $line);
});

关键点:

  • set_error_handler 把 PHP Notice/Warning 转成 ErrorException,统一进 set_exception_handler 流程
  • 不要在 handler 里调用 exit 或 die,Workerman 依赖进程自然死亡后由 manager 拉起
  • 日志路径必须可写,否则 error_log 静默失败

Worker::onError 是最后的日志防线

Workerman 提供了 Worker::onError 回调,它在 worker 进程因致命错误退出前触发,比 set_exception_handler 更早一层:

稿定抠图
稿定抠图

一款基于AI自动识别主体并移除图片背景的在线抠图工具,可快速制作透明背景素材和进行后续图片设计。

下载
Worker::$onError = function ($worker, $errno, $errmsg, $filename, $lineno) {
    error_log("[WORKER ERROR] #{$worker->id} {$errno}: {$errmsg} in {$filename}:{$lineno}");
};

这个回调的特点:

  • 只对 worker 进程生效,manager/master 崩溃时不会触发
  • 参数里的 $errno 是 PHP 错误码(如 E_ERROR),不是系统信号
  • 它不替代 set_exception_handler,而是补充——比如 require 文件不存在这种 Parse Error 就走不到 exception handler

别忘了 daemonize 和 ulimit 这两个隐形杀手

很多“进程启动几秒就消失”根本不是异常导致的,而是基础配置失败:

  • 用 -d 守护运行时,$worker->pidFile 必须是绝对路径,且目录可写,否则静默退出
  • ulimit -n 低于 65535 会导致大量连接时触发 Too many open files,worker 直接 exit
  • 日志文件路径(Worker::$logFile)也得是绝对路径,否则 onError 日志全丢

真正的稳定性不来自某一行 catch,而在于让每次崩溃都可定位、可重建、不扩散——manager 进程看到 worker 退出,会立刻 fork 新进程,但前提是你的 onWorkerStart 不能再崩一次,否则形成雪崩。

相关文章

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

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

下载

相关标签:

workerman

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

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

1049

5

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.25

3340

5

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

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

2026.05.20

226

15

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

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

2026.05.20

222

12

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

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

2026.05.20

227

13

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

20

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

20

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

20

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

20

15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习