🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# onWorkerStart [TOC] 此事件在`Worker`进程/`Task`进程启动时发生。这里创建的对象可以在进程生命周期内使用。原型: ~~~ function onWorkerStart(swoole_server $server, int $worker_id); ~~~ * `onWorkerStart`/`onStart`是并发执行的,没有先后顺序 * 可以通过`$server->taskworker`属性来判断当前是`Worker`进程还是`Task`进程 * 设置了`worker_num`和`task_worker_num`超过`1`时,每个进程都会触发一次`onWorkerStart`事件,可通过判断`$worker_id`区分不同的工作进程 * 由 worker 进程向 task 进程发送任务,task 进程处理完全部任务之后通过onFinish回调函数通知 worker 进程。例如,我们在后台操作向十万个用户群发通知邮件,操作完成后操作的状态显示为发送中,这时我们可以继续其他操作。等邮件群发完毕后,操作的状态自动改为已发送。 ## 注意事项 * 发生致命错误或者代码中主动调用`exit`时,`Worker`/`Task`进程会退出,管理进程会重新创建新的进程。这可能导致死循环,不停地创建销毁进程 下面的示例用于为`Worker`进程/`Task`进程重命名。 ~~~ $serv->on('WorkerStart', function ($serv, $worker_id){ global $argv; if($worker_id >= $serv->setting['worker_num']) { swoole_set_process_name("php {$argv[0]} task worker"); } else { swoole_set_process_name("php {$argv[0]} event worker"); } }); ~~~ 如果想使用`Reload`机制实现代码重载入,必须在`onWorkerStart`中`require`你的业务文件,而不是在文件头部。在`onWorkerStart`调用之前已包含的文件,不会重新载入代码。 > 可以将公用的、不易变的php文件放置到`onWorkerStart`之前。这样虽然不能重载入代码,但所有`Worker`是共享的,不需要额外的内存来保存这些数据。 > `onWorkerStart`之后的代码每个进程都需要在内存中保存一份 * `$worker_id`是一个从`[0-$worker_num)`区间内的数字,表示这个`Worker`进程的`ID` * `$worker_id`和进程`PID`没有任何关系,可使用`posix_getpid`函数获取`PID` ## 协程支持 `2.1.0`版本`onWorkerStart`回调函数中创建了协程,在`onWorkerStart`可以调用协程`API`