addProcess函数 是添加一个用户自定义的工作进程。这个有什么用呢?服务在启动后,可以用于监控、上报或者其他特殊的任务。
注意这个添加的进程是被manager进程管理的。如果这个添加的用户进程经常exit的话,会不断的被manager拉起。所以这个用户进程需要守护,最简单就是让它是一个死循环,不让它频繁退出。
现在写一个测试脚本。作用是创建一个用户进程,可以获取当前服务的一些状态,比如得到当前Server的活动TCP连接数,启动时间,accpet/close的总次数等信息。
<?php //演示添加一个进程,然后接受信息,获取当前服务端有多少连接数 //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0.1", 9501); //监听连接进入事件 $serv->on('connect', function ($serv, $fd) { echo "Client: Connect.\n"; }); $globServiceProcess = new swoole_process(function($process) use ($serv) { while (true) { $msg = $process->read(); $msg = json_decode($msg,true); $statsArr = $serv->stats(); //发回给当前请求的用户 if(isset($msg['command'])){ $sendMsg = $statsArr[$msg['command']]??"无效指令"; $serv->send($msg['fd'],sprintf("连接fd=%d:结果=%s".PHP_EOL,$msg['fd'],$sendMsg)); } } }); $serv->addProcess($globServiceProcess); //监听数据接收事件 $serv->on('receive', function ($serv, $fd, $from_id, $data) use($globServiceProcess) { if($data){ $data = trim($data); echo '通过管道发送给globServiceProcess指令,获取内容'.PHP_EOL; //发送的内容长度在Linux系统下最大不超过8K $globServiceProcess->write(json_encode(['command'=>$data,'fd'=>$fd])); echo json_encode(['command'=>$data,'fd'=>$fd]); } $serv->send($fd, "Server: ".$data.PHP_EOL); }); //监听连接关闭事件 $serv->on('close', function ($serv, $fd) { echo "Client: Close.\n"; }); //启动服务器 $serv->start();
在cli端启动服务。
然后telnet访问,先多开几个telnet,加大连接数