3、Workerman 基本使用 - Workerman TcpConnection 构造函数与进程数量
hi,我是温新,一名 PHPer
Connection 类有两个类,一个是 TcpConnection
,另一个是 AsyncTcpConnection
。我们先来了解一下 TcpConnection 类。
自律是一件听重要的事情,文档还是多看看。
回调属性
onMessage
、onClose
、onBufferFull
、onBufferDrain
、onError
的作用等同于 Worker
中的回调作用,不同的是 Connection 中的这些回调只针对当前连接有效。
属性
- id:连接 ID
- worker:只读数组,包含当前 Connection 对象的所属的 worker 实例
接口
- send:向客户端发送数据
- getTemoteIp:获取该连接的客户端 IP
- getRemotePort:获得该连接的客户端端口
使用 tcp 连接学习相关回调与属性
案例 1
1)创建启动程序的文件
根目录下创建 conn-construct.php
,内容如下:
<?php
/**
* conn-construct.php
*
* 该脚本用于输出客户端连接时的相关信息
*/
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$tcp = new Worker('tcp://0.0.0.0:8888');
// 设置连接建立时的回调函数
$tcp->onConnect = function (TcpConnection $connection) {
// 当客户端发送数据时,触发此回调函数
$connection->onMessage = function (TcpConnection $connection) {
// 输出当前客户端连接的相关信息
echo '当前客户端连接 ID:' . $connection->id . PHP_EOL;
echo '当前客户端连接 IP:' . $connection->getRemoteIp() . PHP_EOL;
echo '当前客户端连接端口:' . $connection->getRemotePort() . PHP_EOL;
echo '当前客户端连接地址:' . $connection->getLocalAddress() . PHP_EOL;
// 遍历所有已连接的客户端
foreach($connection->worker->connections as $conn) {
$conn->send("hello\n");
}
};
// 设置客户端断开连接时的回调函数
$connection->onClose = function (TcpConnection $connection) {
echo $connection->id . ' 断开连接' . PHP_EOL;
};
};
Worker::runAll();
2)启动服务程序
$ php conn-construct.php start
Workerman[conn-construct.php] start in DEBUG mode
------------------------------------------- WORKERMAN -------------------------------------------
Workerman version:4.1.15 PHP version:8.2.0 Event-Loop:\Workerman\Events\Event
-------------------------------------------- WORKERS --------------------------------------------
proto user worker listen processes status
tcp codeing none tcp://0.0.0.0:8888 1 [OK]
-------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
3)客户端连接并测试
# 客户端 2 连接
$ telnet 127.0.0.1 8888
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello
# 客户端 1 连接后发送数据并退出
# 服务端输出
$ php conn-construct.php start
...
当前客户端连接 ID:2
当前客户端连接 IP:127.0.0.1
当前客户端连接端口:53580
当前客户端连接地址:127.0.0.1:8888
2 断开连接
案例 2
下面使用 pauseRecv 和 resumeRecv 来演示数据接收的暂停与恢复。
<?php
/**
* conn-pr.php
*
* 演示暂停与恢复数据接收
*/
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$tcp = new Worker('tcp://0.0.0.0:8888');
$tcp->onConnect = function (TcpConnection $connection) {
// 初始化该连接的消息计数器为 1
$connection->messageCount = 1;
};
// 当接收到客户端消息时触发回调函数
$tcp->onMessage = function (TcpConnection $connection, $data) {
// 设置最大接收消息数量限制
$limit = 3;
// 接收的信息是否超过限制
if (++$connection->messageCount >= $limit) {
// 当接收的消息超过限制时,暂停数据接收
$connection->pauseRecv();
// 5 秒后恢复数据接收
Timer::add(5, function ($conn) {
$conn->resumeRecv();
}, [$connection], false);
}
$connection->send($connection->messageCount);
};
Worker::runAll();
测试
服务端启动程序
$ php conn-pr.php start
客户端连接测试
$ telnet 127.0.0.1 8888
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
a
2a
3a
a # 发送数据超过了限制,客户端暂停数据接收
a # 到达限制时间后,服务端恢复数据接收
# 并发送暂停第一次接收到的数据
4
Connection closed by foreign host.
请登录后再评论