怎样理解服务端中TCP/UDP服务器的属性

这篇文章将为大家详细讲解有关怎样理解服务端中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

只能在onStartonWorkerStart之后获取到

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服务器的属性就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


【AD】美国洛杉矶/香港/日本VPS推荐,回程电信CN2 GIA线路,延迟低、稳定性高、免费备份_搬瓦工

【AD】炭云:36元/年/1GB内存/20GB SSD空间/500GB流量/5Gbps端口/KVM/香港/国际线路LUMEN