这篇文章将为大家详细讲解有关怎样理解服务端中TCP/UDP服务器的属性,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
$setting
Server->set()
函数所设置的参数会保存到Server->setting
属性上. 在回调函数中可以访问运行参数的值.
Swoole\\Server->setting
demo:
$server = new Swoole\\Server('127.0.0.1', 9501); $server->set([ 'worker_num'=>4, ]); var_export($server->setting); echo PHP_EOL; //$server->start(); //这里不需要start就可以执行上面的代码
直接运行:
$master_pid
返回当前服务器主进程的PID
Swoole\\Server->master_pid: int
demo:
$server = new Swoole\\Server('127.0.0.1', 9501); $server->set([ 'worker_num'=>4, ]); var_export($server->setting); echo PHP_EOL; $server->on('start', function(Swoole\\Server $server){ //获取当前服务器主进程的 PID echo 'master_pid:'.$server->master_pid.PHP_EOL; }); $server->on('receive', function(Swoole\\Server $server, $fd, $reactor_id, $data){ //收到客户端信息, 回复内容, 并关闭连接 $server->send($fd, 'Swoole Server received your data:'.trim($data).PHP_EOL); $server->close($fd); }); $server->start();
启动服务并使用telnet连接, 然后在客户端发送消息”aaa”:
$manager_pid
但会当前服务器管理进程的PID
Swoole\\Server->manager_pid: int
只能在
onStart
、onWorkerStart
之后获取到
demo:
$server = new Swoole\\Server('127.0.0.1', 9501); $server->on('start', function(Swoole\\Server $server){ //获取当前服务器管理进程的 PID echo 'manager_pid:'.$server->manager_pid.PHP_EOL; }); $server->on('receive', function(Swoole\\Server $server, $fd, $reactor_id, $data){ //收到客户端信息, 回复内容, 并关闭连接 $server->send($fd, 'Swoole Server received your data:'.trim($data).PHP_EOL); $server->close($fd); }); $server->start();
和上面一样, 启动服务并使用telnet连接, 然后在客户端发送消息”aaa”:
$worker_id
得到当前Worker
进程的编号, 包括Task
进程.
Swoole\\Server->worker_id: int
demo:
$server = new Swoole\\Server('127.0.0.1', 9501); $server->set([ 'worker_num'=>4, 'task_worker_num'=>4, ]); $server->on('workerStart', function(Swoole\\Server $server, $workerId){ if($server->taskworker){ echo 'task workerId:'.$workerId; echo ', task worker_id:'.$server->worker_id.PHP_EOL; }else{ echo 'workerId:'.$workerId; echo ', worker_id:'.$server->worker_id.PHP_EOL; } }); //必须设置onReceive事件回调函数 $server->on('receive', function(Swoole\\Server $server, $fd, $reactor_id, $data){ }); //必须设置onTask事件回调函数 $server->on('task', function(Swoole\\Server $server, $task_id, $reactor_id, $data){ }); $server->start();
启动服务器:
-
这个
Swoole\\Server->worker_id
属性与onWorkerStart
的$worker_id
是相同的. -
Worker
进程编号范围是[0, $server->setting['worker_num'] - 1]
-
Task进程编号范围是:
[$sever->setting['worker_num'], $server->setting['worker_num'] + $server->setting['task_worker_num']]
.
Worker
进程重启后worker_id
的值是不变的
$worker_pid
得到当前Worker
进程的操作系统进程ID, 与posix_getpid()
的返回值相同.
Swoole\\Server->worker_pid: int
$taskworker
当前进程是否是Task进程
Swoole\\Server->taskworker: bool
返回值: true
表示当前进程是Task
工作进程, 否则就是Worker
进程
$connections
TCP
连接迭代器, 可以使用foreach
遍历服务器当前所有的连接, 此属性的功能与Server->getClientList
是一致的, 但是更加友好.
遍历的元素为单个连接的fd
.
Swoole\\Server->connections
$connections
属性是一个迭代器对象, 不是PHP数组, 所以不能用var_dump
或者数组下标来访问, 只能通过foreach
来循环.
-
Base 模式
-
SWOOLE_BASE
模式下不支持夸进程操作TCP
连接, 因此在BASE模式中, 只能在当前进程内使用$connections
迭代器.
demo:
foreach($server->connections as $fd){ var_dump($fd); } echo '当前服务器共有'.count($server->connections).'个连接'.PHP_EOL;
$ports
监听的端口数组. 如果服务器监听了多个端口, 可以遍历Server::$ports
得到所有Swoole\\Server\\Port
对象.
其中swoole_server::$ports[0]
为构造方法所设置的主服务器端口.
$ports = $server->ports; $ports[0]->set($settings); $ports[1]->on('receive', function(){ //onReceive event callback function }); ```
关于怎样理解服务端中TCP/UDP服务器的属性就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。