WorkMan手册笔记-定时器类

一、定时执行某个函数或者类方法

int \Workerman\Lib\Timer::add(float $time_interval, callable $callback [,$args = array(), bool $persistent = true])

参数

time_interval

多长时间执行一次,单位秒,支持小数,可以精确到0.001,即精确到毫秒级别。

callback

回调函数注意:如果回调函数是类的方法,则方法必须是public属性

args

回调函数的参数,必须为数组,数组元素为参数值

persistent

是否是持久的,如果只想定时执行一次,则传递false(只执行一次的任务在执行完毕后会自动销毁,不必调用Timer::del())。默认是true,即一直定时执行。

返回值

返回一个整数,代表计时器的timerid,可以通过调用Timer::del($timerid)销毁这个计时器。

二、删除定时器

参数

timer_id

定时器的id,即add接口返回的整型

返回值

Boolean

三、注意事项

1、只能在onXXXX回调中添加定时器。全局的定时器推荐在onWorkerStart回调中设置,针对某个连接的定时器推荐在onConnect中设置。

2、添加的定时任务在当前进程执行,如果任务很重(特别是涉及到网络IO的任务),可能会导致该进程阻塞,暂时无法处理其它业务。所以最好将耗时的任务放到单独的进程运行,例如建立一个/多个Worker进程运行

3、当一个任务没有在预期的时间运行完,这时又到了下一个运行周期,则会等待当前任务完成才会运行。也就是说当前进程的任务都是串行执行的,如果是多进程则进程间的任务运行是并行的。

4、需要注意多进程设置了定时任务造成并发问题。

5、可能会有1毫秒左右的误差。

WorkerMan手册笔记二-TcpConnection类说明

一、介绍

每个客户端连接对应一个Connection对象,可以设置对象的onMessage、onClose等回调,同时提供了向客户端发送数据send接口与关闭连接close接口,以及其它一些必要的接口。

可以说Worker是一个监听容器,负责接受客户端连接,并把连接包装成connection对象式提供给开发者操作。

二、属性

名称

说明

int Connection::$id

连接的id。这是一个自增的整数。

注意:workerman是多进程的,每个进程内部会维护一个自增的connection id,所以多个进程之间的connecion id会有重复。 如果想要不重复的connection id 可以根据需要给connection->id重新赋值,例如加上worker->id前缀。

string Connection::$protocol

设置当前连接的协议类

Worker Connection::$worker

此属性为只读属性,即当前connection对象所属的worker实例

int Connection::$maxSendBufferSize

此属性用来设置当前连接的应用层发送缓冲区大小。不设置默认为Connection::$defaultMaxSendBufferSize(1MB)。Connection::$maxSendBufferSize 和 Connection::$defaultMaxSendBufferSize均可以动态设置。

此属性影响onBufferFull回调

static int Connection::$defaultMaxSendBufferSize

此属性为全局静态属性,用来设置所有连接的默认应用层发送缓冲区大小。不设置默认为1MB。 Connection::$defaultMaxSendBufferSize可以动态设置,设置后只对之后产生的新连接有效

static int Connection::$maxPackageSize

此属性为全局静态属性,用来设置每个连接能够接收的最大包包长。不设置默认为10MB。

三、回调属性

名称

说明

callback Connection::$onMessage

作用与Worker::$onMessage回调相同,区别是只针对当前连接有效,也就是可以针对某个连接的设置onMessage回调。

callback Connection::$onClose

此回调与Worker::$onClose回调作用相同,区别是只针对当前连接有效,也就是可以针对某个连接的设置onClose回调

callback Connection::$onBufferFull

作用与Worker::$onBufferFull回调相同,区别是只针对当前连接起作用,即可以单独设置某个连接的onBufferFull回调

callback Connection::$onBufferDrain

作用与Worker::$onBufferDrain回调相同,区别是只针对当前连接起作用,即可以单独设置某个连接的onBufferDrain回调

callback Connection::$onError

作用与Worker::$onError回调相同,区别是只针对当前连接起作用,即可以单独设置某个连接的onError回调

四、接口

名称

参数

返回值

说明

mixed Connection::send(mixed $data [,$raw = false])

$data 要发的数据

$row 是否发原始数据

true 表示发送成功

null 表示放入待发送队列,等待异步发送

false 表示发送失败,失败原因可能是客户端连接已经关闭,或者该连接的应用层发送缓冲区已满

向客户端发送数据

string Connection::getRemoteIp()

String

获得该连接的客户端ip

int Connection::getRemotePort()

获得该连接的客户端端口

void Connection::close(mixed $data = ”)

$data   可选参数,要发送的数据(如果有指定协议,则会自动调用协议的encode方法打包$data数据),当数据发送完毕后关闭连接,随后会触发onClose回调

调用close会等待发送缓冲区的数据发送完毕后才关闭连接,并触发连接的onClose回调

void Connection::destroy()

与close不同之处是,调用destroy后即使该连接的发送缓冲区还有数据未发送到对端,连接也会立刻被关闭,并立刻触发该连接的onClose回调。

void Connection::pauseRecv(void)

使当前连接停止接收数据。该连接的onMessage回调将不会被触发。此方法对于上传流量控制非常有用

void Connection::resumeRecv(void)

使当前连接继续接收数据。此方法与Connection::pauseRecv配合使用,对于上传流量控制非常有用

void Connection::pipe(TcpConnection $target_connection)

将当前连接的数据流导入到目标连接。内置了流量控制。此方法做TCP代理非常有用

Workman手册笔记一

安装workerman参考:http://www.workerman.net/install

下载workerman扩展包git clone https://github.com/walkor/Workerman

手册参考:http://doc3.workerman.net/

一、WorkerMan代码规范

1、  类采用首字母大写的驼峰式命名,类文件名称必须与文件内部类名相同,以便自动加载。

2、  使用命名空间,命名空间名字与目录路径对应,并以开发者的项目根目录为基准

3、  普通函数及变量名采用小写加下划线方式

4、  类成员及类的方法采用首字母小写的驼峰形式

5、  函数及类的参数采用小写加下划线方式

二、Worker类属性说明

名称 类型 说明
$id Int 当前worker进程的id编号,范围为0到$worker->count-1
$count Int 设置当前Worker实例启动多少个进程,不设置时默认为1
$name String 设置当前Worker实例的名称,方便运行status命令时识别进程。不设置时默认为none
$user String 设置当前Worker实例以哪个用户运行。此属性只有当前用户为root时才能生效。不设置时默认以当前用户运行
$reloadable Bool 设置当前Worker实例是否可以reload,即收到reload信号后是否退出重启。不设置默认为true,收到reload信号后自动重启进程
$transport String 设置当前Worker实例所使用的传输层协议,目前只支持两种,tcp和udp。不设置默认为tcp
$connections Array 此属性中存储了当前进程的所有的客户端连接
$daemonize Static Bool 此属性为全局静态属性,表示是否以daemon(守护进程)方式运行。如果启动命令使用了 -d参数,则该属性会自动设置为true。也可以代码中手动设置
$stdoutFile Static String 此属性为全局静态属性,如果以守护进程方式(-d启动)运行,则所有向终端的输出(echo var_dump等)都会被重定向到stdoutFile指定的文件中。

 

如果不设置,并且是以守护进程方式运行,则所有终端输出全部重定向到/dev/null

$pidFile Static String 如果无特殊需要,建议不要设置此属性

 

此属性为全局静态属性,用来设置WorkerMan进程的pid文件路径。

 

此项设置在监控中比较有用,例如将WorkerMan的pid文件放入固定的目录中,可以方便一些监控软件读取pid文件,从而监控WorkerMan进程状态。

 

$logFile Static String

 

用来指定workerman日志文件位置。

此文件记录了workerman自身相关的日志,包括启动、停止等。

如果没有设置,文件名默认为workerman.log,文件位置位于Workerman的上一级目录中。

备注:只记录workman自身相关日志

$globalEvent Static Event 此属性为全局静态属性,为全局的eventloop实例,可以向其注册文件描述符的读写事件或者信号事件
$reusePort Bool 设置当前worker是否开启监听端口复用(socket的SO_REUSEPORT选项),默认为false,不开启。

 

开启监听端口复用后允许多个无亲缘关系的进程监听相同的端口,并且由系统内核做负载均衡,决定将socket连接交给哪个进程处理,避免了惊群效应,可以提升多进程短连接应用的性能。

 

注意:此特性需要PHP版本>=7.0

$protocol String 设置当前Worker实例的协议类。

 

注:协议处理类可以直接在初始化Worker在监听参数时直接指定

 

三、回调属性

名称 参数 说明
callback Worker::$onWorkerStart $worker 设置Worker启动时的回调函数,即当Worker启动后立即执行Worker::onWorkerStart成员指定的回调函数

callback Worker::$onWorkerReload

$worker 设置Worker收到reload信号后执行的回调。

 

可以利用onWorkerReload回调做很多事情,例如在不需要重启进程的情况下重新加载业务配置文件

注意:

 

子进程收到reload信号默认的动作是退出重启,以便新进程重新加载业务代码完成代码更新。所以reload后子进程在执行完onWorkerReload回调后便立刻退出是正常现象。

 

如果在收到reload信号后只想让子进程执行onWorkerReload,不想退出,可以在初始化Worker实例时设置对应的Worker实例的reloadable属性为false

callback Worker::$onWorkerStop $worker 设置Workert停止时的回调函数,即当Worker收到stop信号后执行Worker::onWorkerStop指定的回调函数
callback Worker::$onConnect $connection 当有客户端连接时触发的回调函数
callback Worker::$onMessage $connection

$data 客户端发送的数据

当有客户端的连接上有数据发来时触发
callback Worker::$onClose $connection 当客户端的连接断开时触发,不管连接是如何断开的,只要断开就会触发
callback Worker::$onBufferFull $connection 每个连接都有一个单独的应用层发送缓冲区,缓冲区大小由TcpConnection::$maxSendBufferSize决定,默认值为1MB,可以手动设置更改大小,更改后会对所有连接生效。

更多:http://doc3.workerman.net/worker-development/on-buffer-full.html

callback Worker::$onBufferDrain $connection 每个连接都有一个单独的应用层发送缓冲区,缓冲区大小由TcpConnection::$maxSendBufferSize决定,默认值为1MB,可以手动设置更改大小,更改后会对所有连接生效。

 

该回调在应用层发送缓冲区数据全部发送完毕后触发。一般与onBufferFull配合使用,例如在onBufferFull时停止向对端继续send数据,在onBufferDrain恢复写入数据。

callback Worker::$onError $connection

$code

$msg

当客户端的连接上发生错误时触发。

目前错误类型有

 

1、调用Connection::send由于客户端连接断开导致的失败 (code:WORKERMAN_SEND_FAIL msg:client closed)

 

2、在触发onBufferFull后,仍然调用Connection::send,并且发送缓冲区仍然是满的状态,导致发送失败 (code:WORKERMAN_SEND_FAIL msg:send buffer full and drop package)

 

3、使用AsyncTcpConnection异步连接失败时 (code:WORKERMAN_CONNECT_FAIL msg:stream_socket_client返回的错误消息)

 

四、接口

名称 参数 返回值 说明
void Worker::runAll(void) 运行所有worker实例
void Worker::stopAll(void) 停止当前进程(子进程)的所有Worker实例并退出。

 

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

 

与直接调用exit/die区别是,直接调用exit或者die无法触发onWorkerStop回调,并且会导致一条WORKER EXIT UNEXPECTED错误日志。

void Worker::listen(void)     用于实例化Worker后执行监听。

 

此方法主要用于在Worker进程启动后动态创建新的Worker实例,能够实现同一个进程监听多个端口,支持多种协议。

 

例如一个http Worker启动后实例化一个websocket Worker,那么这个进程即能通过http协议访问,又能通过websocket协议访问。由于websocket Worker和http Worker在同一个进程中,所以它们可以访问共同的内存变量,共享所有socket连接。可以做到接收http请求,然后操作websocket客户端完成向客户端推送数据类似的效果。