3、Workerman 基本使用 - Workerman TcpConnection 构造函数与进程数量

作者: 温新

图书: 【Workerman 基本使用】

阅读: 139

时间: 2024-04-23 10:23:33

hi,我是温新,一名 PHPer

Connection 类有两个类,一个是 TcpConnection,另一个是 AsyncTcpConnection。我们先来了解一下 TcpConnection 类。

自律是一件听重要的事情,文档还是多看看。

回调属性

onMessageonCloseonBufferFullonBufferDrainonError 的作用等同于 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.
请登录后再评论