Worker类

作者: 爱折腾的傻小子 | 来源:发表于2018-10-29 11:06 被阅读3次

回调属性


onWorkerStart

参考

Worker::$onWorkerStart = callback
  • 当Worker启动后立即执行Worker::onWorkerStart成员指定的回调函数(public方法,函数,静态方法等)
  • 回调函数存在一个参数(表示Worker的一个实例对象)
//> onWorkerStart 回调属性,在Worker被实例化时执行一次(里面的代码也只会被执行一次)
//> 每个进程被启动都会执行一次,$worker则表示的当前进程的worker实例
$worker->onWorkerStart = function($worker){ 
      //> $worker参数是WorkerMan自动注入的Worker实例
};
  • 经过测试,onWorkerStart回调属性:只会在Worker的每个进程启动时执行一次(其他时候不会被执行)
  • onWorkerStart 回调属性中定义的,将被当前进程所共享(就是在这里处理所有进程都需要执行的代码)

当我们在创建Worker类实例对象时,执行onWorkerStart回调属性:

//> 此时,默认 $worker->id = 0;
//> 此时,$worker->connections = [];
总结:

WorkerMan在启动时,会创建Worker实例,并依次启动每个进程,每启动一个进程,则会执行一次 onWorkerMan 回调属性,并且传递当前子进程的worker实例做为回调函数的参数。
onWorkerStart 回调属性:里面的代码对当前所有进程里面的所有链接对象所共享。(我们可以加上指定的逻辑判断,在不同的进程中设置不同的功能)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

onConnect

参考

Worker::$onConnect = callback

当连接建立时触发回调函数,每个连接只触发一次(连接一次就会触发一次)
自动注入:TcpConnection类的实例参数,保存当前链接的信息


关于TcpConnection类的属性和参数参考文档。
connection->getRemoteIp()** 获取链接客户端的ip地址 **connection->id 获取当前客户端连接分配的id编号

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

onClose

参考

Worker::$onClose = callback;

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

onMessage

参考
当客户端的链接有数据发送来是触发

//> 回调函数的参数,详解:
$connection 保存的是当前客户端的连接对象,该对象是TcpConnection类的实例
//> $data 连接客户端发送过来的数据。(如果设置了协议,$data是对应协议decode解码的数据)

$worker 表示的当前进程的worker实例对象信息

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

onWorkerStop

参考

//> 当Worker收到stop(即执行Worker::stopAll()时),触发该回调函数
Worker::$onWorkerStop = callback

回调函数的参数:

  • $worker :Worker对象实例
    注意:
  • 如果业务代码发生致命错误(Fatal Error)或者进程被强行kill掉则不会触发onWorkerStop回调
  • onWorkerStop 回调事件,是每关闭一个进程(子进程)|每注销一个worker实例,就会执行一次回调函数。
  • 我们知道,当前进程的所有子进程都是一个worker实例对象。

属性


id : 当前进程id标号 ( 写 / 读 )

参考

//> 当前进程的id编号,从0开始(可以手动设置)
//> 如果想手动设置Worker::$id的值,在onWorkerStart回调属性中设置
//> (推荐不要改动,但是我们可以加前缀区别)
int Worker::$id
  • Worker::id 标识的是,当前Worker中的所有进程的编号;( 从0开始到Worker::count-1 )
count ( 写 / 读 )

参考

//> 设置当前Worker启动的进程数量,默认值为1
int Worker::$count

接口


runAll

参考

//> 运行所有Worker实例
void Worker::runAll( void );

注意:

  • Worker::runAll() 执行后将永久阻塞;(就是说Worker::runAll()后的代码没有任何意义,程序到这就一直处于等待状态)
  • 所有Worker实例化都应该在 Worker::runAll() 前执行;(就是,所进程时,在开始就已经创建了多个worker实例对象)
    参数 : 无参数( void )
    返回值 : 无返回值( void )
    注意:
  • WorkerMan虽然能在一个文件中实例化多个Worker,但是在Windows下只支持实例化一个WorkerMan实例。
  • Windows下只支持一个进程(这就是用windows调试workerMan最痛苦的事情)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

stopAll

参考

//> 停止当前进程(子进程)的所有Worker实例并退出
//> 注意:停止的是当前进程实例
//> 停止当前进程,主进程会立刻重新启动一个全新的进程补充上来(该进程的编号不会改变)
void Worker::stopAll( void )

此方法用于安全退出当前子进程,作用相当于调用exit/die退出当前子进程
区别:

  • 直接调用exit或die无法触发onWorkerSttop回调,并且会导致一条WORKER EXIT UNEXPECTED错误日志。
    参数:无参数 ( void )
    返回值:无返回值 ( void )

相关文章

网友评论

      本文标题:Worker类

      本文链接:https://www.haomeiwen.com/subject/zjdjbttx.html