回调属性
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->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::
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 )
网友评论