本文章对应的视频课程:swoole从入门到精通(第一季)-学习视频教程-腾讯课堂
欢迎加入swoole/workerman技术交流群:604438441
Server 属性
$setting
set()函数所设置的参数会保存到Server->$setting属性上
$master_pid
返回当前服务器主进程的PID。
$manager_pid
返回当前服务器管理进程的PID。
$worker_id
得到当前Worker进程的编号,包括Task进程。
$worker_pid
得到当前Worker进程的操作系统进程ID。与posix_getpid()的返回值相同
$connections
TCP连接迭代器,可以使用foreach遍历服务器当前所有的连接,此属性的功能与Server->getClientList是一致的,但是更加友好。遍历的元素为单个连接的fd。
$taskworker
布尔类型
true表示当前的进程是Task工作进程
false表示当前的进程是Worker进程
$ports
Server on
on(string $event, mixed $callback);
第1个参数是回调的名称, 大小写不敏感
第2个函数是回调的PHP函数
Server 回调函数 4种写法
第一种 匿名函数
$a = 'lampol';
$server->on(‘start’,function($serv) use($a){ //use向匿名函数传递参数
echo 'hello....'.$a;
});
第二种 函数
$server->on('start','test_start');
function test_start($serv){
echo 'master_pid......========'.$serv->master_pid;
}
第三种 对象方法
$test = new Test();
$server->on('start',[$test,'test_start']);
class Test{
public function test_start($serv){
echo 'master_pid......========'.$serv->master_pid;
}
}
第四种 类静态方法
$server->on('start','Test::test_start');
class Test{
public static function test_start($serv){
echo 'master_pid......========'.$serv->master_pid;
}
}
Server 回调函数
onStart(Server $server);
启动后在主进程(master)的主线程回调此函数
onStart回调中,仅允许echo、打印Log、修改进程名称。不得执行其他操作。
BASE模式下没有master进程,因此不存在onStart事件。
onStart回调中,仅允许echo、打印Log、修改进程名称。不得执行其他操作。onWorkerStart和onStart回调是在不同进程中并行执行的,不存在先后顺序。
onWorkerStart(swoole_server $server, int $worker_id);
此事件在Worker进程/Task进程启动时发生。这里创建的对象可以在进程生命周期内使用
onManagerStart(swoole_server $serv);
当管理进程启动时调用它 在这个回调函数中可以修改管理进程的名称。
swoole_set_process_name 用于设置进程的名称
在onManagerStart修改为manager进程名称
onStart调用时修改为主进程名称
onWorkerStart修改为worker进程名称
onWorkerError(swoole_server $serv, int $worker_id, int $worker_pid, int $exit_code, int $signal);
$worker_id 是异常进程的编号
$worker_pid 是异常进程的ID
$exit_code 退出的状态码,范围是 0~255
$signal 进程退出的信号
kill -9 进程号 强制结束
当Worker/Task进程发生异常后会在Manager进程内回调此函数。此函数主要用于报警和监控
onWorkerStop(Swoole\Server $server, int $worker_id);
kill 进程号/正常 触发max_req
此事件在Worker进程终止时发生。在此函数中可以回收Worker进程申请的各类资源
onConnect(swoole_server $server, int $fd, int $reactorId);
有新的连接进入时,在worker进程中回调
$server是Swoole\Server对象
$fd是连接的文件描述符,发送数据/关闭连接时需要此参数
$reactorId来自哪个Reactor线程
onReceive(swoole_server $server, int $fd, int $reactor_id, string $data);
接收到数据时回调此函数,发生在worker进程中
$server,Server对象
$fd,TCP客户端连接的唯一标识符
$reactor_id,TCP连接所在的Reactor线程ID
$data,收到的数据内容,可能是文本或者二进制内容
onClose(swoole_server $server, int $fd, int $reactorId);
TCP客户端连接关闭后,在worker进程中回调此函数
无论由客户端发起close还是服务器端主动调用$serv->close()关闭连接,都会触发此事件
Server 异步任务投递
onTask(swoole_server $serv, int $task_id, int $src_worker_id, mixed $data);
在task_worker进程内被调用。worker进程可以使用swoole_server_task函数向task_worker进程投递新的任务
onFinish(swoole_server $serv, int $task_id, string $data)
当worker进程投递的任务在task_worker中完成时,task进程会通过swoole_server->finish()方法将任务处理的结果发送给worker进程。
task(mixed $data, int $task_worker_id = -1,)
投递一个异步任务到task_worker池中。此函数是非阻塞的,执行完毕会立即返回。必须先设置 task_worker_num,
并且必须设置Server的onTask和onFinish事件回调函数。
1.8.6版本增加了第三个参数,可以直接设置onFinish函数,如果任务设置了回调函数,Task返回结果时会直接执行指定的回调函数,不再执行Server的onFinish回调
$data要投递的任务数据,必须是可序列化的PHP变量
$dst_worker_id可以制定要给投递给哪个Task进程
task模块用来做一些异步的慢速任务,比如webim中发广播,发送邮件等。
onShutdown
onWorkerExit
onPacket udp 接受数据 tcp receive
onPipeMessage
onManagerStop
Server 方法
set(array $setting);
用于设置运行时的各项参数。服务器启动后通过$serv->setting来访问Server->set方法设置的参数数组。
on(string $event, mixed $callback);
第1个参数是回调的名称, 大小写不敏感
第2个函数是回调的PHP函数
start()
启动服务器,监听所有TCP/UDP端口,函数原型:
send(mixed $fd, string $data, int $serverSocket = -1)
向客户端发送数据,发送过程是异步的,底层会自动监听可写,将数据逐步发送给客户端
sendfile(int $fd, string $filename, int $offset =0, int $length = 0);
发送文件到TCP客户端连接。
sendto
向任意的客户端IP:PORT发送UDP数据包。
sendwait
同步地向客户端发送数据。sendwait目前仅可用于SWOOLE_BASE模式
exist(int $fd)
检测fd对应的连接是否存在。
sendMessage(mixed $message, int $dst_worker_id);
此函数可以向任意Worker进程或者Task进程发送消息。在非主进程和管理进程中可调用。收到消息的进程会触发onPipeMessage事件。
getClientInfo(int $fd, int $extraData, bool $ignoreError = false)
获取连接的信息,别名是Server->connection_info
getClientList
用来遍历当前Server所有的客户端连接
bind(int $fd, int $uid)
将连接绑定一个用户定义的UID,可以使用$serv->getClientInfo($fd) 查看连接所绑定UID的值
reload(bool $only_reload_taskworkrer = false)
重启所有Worker/Task进程。
stop(int $worker_id = -1, bool $waitEvent = false);
使当前Worker进程停止运行,并立即触发onWorkerStop回调函数。
close(int $fd, bool $reset = false);
关闭客户端连接
task(mixed $data, int $dst_worker_id = -1)
投递一个异步任务到task_worker池中。此函数是非阻塞的,执行完毕会立即返回。Worker进程可以继续处理新的请求。使用Task功能,必须先设置 task_worker_num,并且必须设置Server的onTask和onFinish事件回调函数。
finish(mixed $response);
此函数用于在Task进程中通知Worker进程,投递的任务已完成。此函数可以传递结果数据给Worker进程。
使用Server->finish函数必须为Server设置onFinish回调函数。此函数只可用于Task进程的onTask回调中 新版本 直接return 就行了
taskwait(mixed $data, float $timeout = 0.5, int $dstWorkerId = -1)
taskwait与task方法作用相同,用于投递一个异步的任务到task进程池去执行。与task不同的是taskwait是同步等待的,超时返回false,否则返回task结果
taskWaitMulti(array $tasks, double $timeout = 0.5)
并发执行多个task异步任务
taskCo(array $tasks, float $timeout = 0.5)
并发执行Task并进行协程调度。 区别 taskWaitMulti主进程等待
stats()
得到当前Server的活动TCP连接数,启动时间,accpet/close的总次数等信息。
heartbeat
检测服务器所有连接,并找出已经超过约定时间的连接
addListener(string $host, int $port, $type = SWOOLE_SOCK_TCP);
增加监听的端口。
liste(string $host, int $port, int $type); 此方法是 addlistener 的别名。
增加监听的端口。业务代码中可以通过调用 Server->getClientInfo 来获取某个连接来自于哪个端口。
主服务器是WebSocket或Http协议,新监听的TCP端口默认会继承主Server的协议设置。必须单独调用set方法设置新的协议才会启用新协议
addProcess(Process $process);
添加一个用户自定义的工作进程。此函数通常用于创建一个特殊的工作进程,用于监控、上报或者其他特殊的任务。
本文章对应的视频课程:swoole从入门到精通(第一季)-学习视频教程-腾讯课堂
欢迎加入swoole/workerman技术交流群:604438441