当前位置: 代码迷 >> 综合 >> Swoole TCP/UDP服务 常用方法
  详细解决方案

Swoole TCP/UDP服务 常用方法

热度:18   发布时间:2023-12-13 22:39:06.0

1.1 set()

用于设置运行时的各项参数。服务器启动后通过 $serv->setting 来访问 Server->set 方法设置的参数数组。

Swoole\Server->set(array $setting): void$server->set(array('reactor_num'   => 2,     // reactor thread num'worker_num'    => 4,     // worker process num'backlog'       => 128,   // listen backlog'max_request'   => 50,'dispatch_mode' => 1,
));
Swoole\Server->on(string $event, mixed $callback): void$server = new Swoole\Server("127.0.0.1", 9501);
$server->on('connect', function ($server, $fd){echo "Client:Connect.\n";
});
$server->on('receive', function ($server, $fd, $reactor_id, $data) {$server->send($fd, 'Swoole: '.$data);$server->close($fd);
});
$server->on('close', function ($server, $fd) {echo "Client: Close.\n";
});
$server->start();
Swoole\Server->addListener(string $host, int $port, int $sockType = SWOOLE_SOCK_TCP): bool|Swoole\Server\Port
?
Swoole\Server->addProcess(Swoole\Process $process): bool
Swoole\Server->reload(bool $only_reload_taskworkrer = false): bool
-reload 有保护机制,当一次 reload 正在进行时,收到新的重启信号会丢弃
- 如果设置了 user/group,Worker 进程可能没有权限向 master 进程发送信息,这种情况下必须使用 root 账户,在 shell 中执行 kill 指令进行重启
-reload 指令对 addProcess 添加的用户进程无效
?
首先要注意新修改的代码必须要在 OnWorkerStart 事件中重新载入才会生效,比如某个类在 OnWorkerStart 之前就通过 composer 的 autoload 载入了就是不可以的。
?
其次 reload 还要配合这两个参数 max_wait_time 和 reload_async,设置了这两个参数之后就能实现异步安全重启。
?
如果没有此特性,Worker 进程收到重启信号或达到 max_request 时,会立即停止服务,这时 Worker 进程内可能仍然有事件监听,这些异步任务将会被丢弃。设置上述参数后会先创建新的 Worker,旧的 Worker 在完成所有事件之后自行退出,即 reload_async。
?
如果旧的 Worker 一直不退出,底层还增加了一个定时器,在约定的时间 ( max_wait_time 秒) 内旧的 Worker 没有退出,底层会强行终止。

并发执行多个 task 异步任务,此方法不支持协程调度,会导致其他协程开始,协程环境下需要用下节的 taskCo

1.22 taskWaitMulti()

taskwaittask 方法作用相同,用于投递一个异步的任务到 task 进程池去执行。与 task 不同的是 taskwait 是同步等待的,直到任务完成或者超时返回。$result 为任务执行的结果,由 $server->finish 函数发出。如果此任务超时,这里会返回 false

1.21 taskwait()

  • 此功能用于将慢速的任务异步地去执行,比如一个聊天室服务器,可以用它来进行发送广播。当任务完成时,在 task 进程中调用 $serv->finish("finish") 告诉 worker 进程此任务已完成。当然 Swoole\Server->finish 是可选的。

  • task 底层使用 unixSocket 通信,是全内存的,没有 IO 消耗。单进程读写性能可达 100万/s,不同的进程使用不同的 unixSocket 通信,可以最大化利用多核。

  • 未指定目标 Task 进程,调用 task 方法会判断 Task 进程的忙闲状态,底层只会向处于空闲状态的 Task 进程投递任务。如果所有 Task 进程均处于忙的状态,底层会轮询投递任务到各个进程。可以使用 server->stats 方法获取当前正在排队的任务数量。

  • 第三个参数,可以直接设置 onFinish 函数,如果任务设置了回调函数,Task 返回结果时会直接执行指定的回调函数,不再执行 Server 的 onFinish 回调

    $server->task($data, -1, function (Swoole\Server $server, $task_id, $data) {echo "Task Callback: ";var_dump($task_id, $data);
    });Copy to clipboardErrorCopied
  • TaskWorker 的数量在 Server::set() 参数中调整,如 task_worker_num => 64,表示启动 64 个进程来接收异步任务

  • 默认不启动 task 功能,需要在手动设置 task_worker_num 来启动此功能

  • $task_id 是从 0-42 亿的整数,在当前进程内是唯一的

提示

投递一个异步任务到 task_worker 池中。此函数是非阻塞的,执行完毕会立即返回。Worker 进程可以继续处理新的请求。使用 Task 功能,必须先设置 task_worker_num,并且必须设置 Server 的 onTask 和 onFinish 事件回调函数。

1.20 task()

遍历当前 Server 所有的客户端连接

1.19 getClientList

获取连接信息

1.18 getclientInfo()

检测fd对应的连接是否存在

1.17 exist()

同步向客户端发送数据

1.16 sendwait()

向指定的客户端(IP)发送UDP数据包

1.15 sendto()

发送文件到TCP客户端连接

1.14 sendfile()

向客户端发送消息

1.13 send()

关闭客户端连接

1.12 close()

清除 tick/after 定时器,此函数是 Swoole\Timer::clear 的别名。

1.11 clearTimer()

延后执行一个函数,是 Event::defer 的别名。

1.10 defer()

添加一个一次性定时器,执行完成后就会销毁。此函数是 Swoole\Timer::after 的别名。

1.9 after()

添加 tick 定时器,可以自定义回调函数。此函数是 Swoole\Timer::tick 的别名。

1.8 tick()

向主进程发送 SIGTERM 也可以实现关闭服务

此函数可以用在 Worker 进程内

关闭服务

1.7 shutsown()

使当前 Worker 进程停止运行,并立即触发 onWorkerStop 回调函数。

1.6 stop()

例如:一台繁忙的后端服务器随时都在处理请求,如果管理员通过 kill 进程方式来终止 / 重启服务器程序,可能导致刚好代码执行到一半终止。 这种情况下会产生数据的不一致。如交易系统中,支付逻辑的下一段是发货,假设在支付逻辑之后进程被终止了。会导致用户支付了货币,但并没有发货,后果非常严重。 Swoole 提供了柔性终止 / 重启的机制,管理员只需要向 Server 发送特定的信号,ServerWorker 进程可以安全的结束。参考 如何正确的重启服务

安全地重启所有 Worker/Task 进程。

1.5 reload() *

不需要执行 start。在 Server 启动时会自动创建进程,并执行指定的子进程函数

添加一个用户自定义的工作进程。此函数通常用于创建一个特殊的工作进程,用于监控、上报或者其他特殊的任务。

1.4 addProcess() *

增加监听的端口。业务代码中可以通过调用 Server->getClientInfo 来获取某个连接来自于哪个端口。

1.3 addListener() 同 listen()

重复调用 on 方法时会覆盖上一次的设定

1.2 on()