Swoole Worker事件

onWorkerStart

原型

function onWorkerStart(swoole_server $server, int $worker_id)

参数:int $worker_id

  • $worker_id是一个从[0 - $worker_num) 区间内的数字,表示这个Worker工作进程的编号。
  • $worker_id和进程PID没有任何关系,可使用posix_getpid函数获取当前进程的PID。

使用

  • onWorkerStart事件会在Worker进程、Task进程启动时发生,事件回调中创建的对象可以在进程生命周期内使用。

  • onWorkerStart事件与onStart事件是并发执行的,并没有固定的先后顺序。

  • 可通过$server->taskworker属性判断当前是Worker工作进程还是Task任务进程

  • 当服务器对象设置了worker_numtask_worker_num选项超过1时,每个进程都会触发一次onWorkerStart事件,可通过判断$worker_id来区分不同的工作进程。

  • Worker进程向Task进程发送任务,Task进程处理完所有任务之后会通过onFinish回调函数通知Worker进程。

例如:在后台操作向10W个用户群发通知邮件,操作完成后操作的状态显示为发送中,此时可以继续其它操作,等邮件群发完毕后,操作的状态自动会修改为已发送。

  • 当发生致命错误或代码中主动调用exit时,Worker工作进程或Task任务进程会退出,Manager管理进程会重新创建新的工作进程,这可以导致死循环,也就是不停地在创建和销毁进程。

  • 如果想使用Reload重载机制实现代码重新加载,必须在onWorkerStartrequire业务文件,而不是在文件头部引入。在onWorkerStart调用之前已经包含的文件不会重新载入代码。

  • 可以将公用的、不易变得PHP文件放置到onWorkerStart之前,这样虽然不能重载代码,但对所有Worker工作进程来说是共享得,也就不需要额外得内存来保存这些数据。onWorkerStart之后的代码,每隔进程都需要在内存中保存一份。

  • Swoole2.1.0版本中onWorkerStart回调函数中创建了协程,在onWorkerStart中可以调用协程的API。

onWorkerStart事件被回调后,Worker进程的任务分配模式是怎么样的呢?

首先Worker进程数据包分配模式取决于服务器运行时配置参数dispatch_mode的值

  • dispatch_mode = 1 表示平均分配
  • dispatch_mode = 2 表示文件描述符取模固定分配,默认方式。
  • dispatch_mode = 3 表示抢占式分配

所谓抢占式分配,指的是每次都是空闲的Worker工作进程获得数据,此方式很适合SOA/RPC类的内部服务框架。当服务器运行时参数配置了抢占式分配模式后,Worker工作进程内发生的onConnectonReceiveonCloseonTimer事件会将Worker进程标记为繁忙状态而不再去接收新的请求。Reactor线程会将新请求投递给其它状态空闲的Worker工作进程上。如果希望每个连接的数据分配都给固定的Worker工作进程,需设置为按文件描述符取模固定分配的方式。

Worker工作进程数据包分配模式

onWorkerStop

原型

function onWorkerStop(Swoole\Server $server, int $worker_id);

onWorkerStop事件在Worker工作进程终止时发生,在此函数中可以回收Worker进程申请的各类资源。

参数

$worker_id是一个从[0 - $worker_num)之间的整型数字,用于表示当前Worker工作进程的编号。另外$worker_id和PID是没有任何关系的。

注意

  • 当进程移除结束,比如被强制kill、致命错误、core dump时是无法执行onWorkerStop回调函数的。
  • 不要再onWorkerStop中调用任何异步或协程相关的API,触发onWorkerStop时底层已经销毁了所有事件循环设施。

onWorkerExit

原型

function onWorkerExit(swoole_server $server, int $worker_id);

onWorkerExit仅在服务器开启了reload_async异步重启特性后才生效,异步重启特性会先创建新的Worker工作进程用来处理新的请求,旧的Worker工作进程会自行退出。旧的Worker工作进程在退出时先会执行一次onWorkerStop事件回调,然后会在事件循环的每个周期结束时调用onWorkerExit通知Worker进程退出。

如果Worker进程没有退出,onWorkerExit会持续触发。onWorkerExit仅仅在Worker工作进程内触发,Task任务进程是不会执行onWorkerExit事件的。

onWorkerExit中应尽可能地移除或关闭异步的Socket连接,最终底层检测到Reactor线程中事件监听的句柄数量为0时会退出进程。


onWorkerError

原型

void onWorkerError(swoole_server $server, int $worker_id, int $worker_pid, int $exit_code, int $signal);

onWorkerError事件主要用于报警和监控,一旦发现Worker工作进程异常退出,那很有可能是遇到了致命错误或进程CoreDump,通过记录日志或发送警报的信息来提示开发者进行相应的处理。

当Worker工作进程或Task任务进程发生异常后,会在Manager管理进程内触发onWorkerError事件回调。

参数

  • int $worker_id 异常进程的编号
  • int $worker_pid 异常进程的PID
  • int $exit_code 退出的状态码,范围时0到255。
  • int $signal 进程退出的信号

进程退出状态码

  • exit_code = 255 表示Worker工作进程发生了Fatal Error致命错误,需检查PHP的错误日志,找到存在问题的代码并进行解决。

进程退出信号

  • signal = 11 说明Worker工作进程发生了segment_fault段错误,可能触发了底层的Bug,需要收集core dump信息和valgrind内存检测日志,向官方反馈。
  • signal = 9 说明Worker工作进程被系统强行kill杀死,需检查是否有认为的kill -9操作,并检查dmesg信息中是否存在OOM(Out of Memory)内存溢出。如果存在内存溢出,则是分配了过大的内存。此时需检测服务器对象的setting属性配置中,是否创建了非常大的Swoole\TableSwoole\Buffer等内存模块。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容