PHP 怎么用Swoole Table

wen PHP项目 2

本文目录导读:

PHP 怎么用Swoole Table

  1. 基础使用
  2. 原子操作
  3. 协程环境中的使用
  4. 实际应用示例
  5. 注意事项
  6. 高级配置

Swoole Table 是一个基于共享内存的高性能并发数据结构,非常适合在 Swoole 环境中存储和管理数据,以下是详细的使用方法:

基础使用

创建和定义表结构

<?php
// 创建表
$table = new Swoole\Table(1024); // 参数为最大行数
// 定义表结构
$table->column('id', Swoole\Table::TYPE_INT, 4);      // 整数类型
$table->column('name', Swoole\Table::TYPE_STRING, 64); // 字符串类型
$table->column('score', Swoole\Table::TYPE_FLOAT);      // 浮点类型
// 创建表
$table->create();

基本操作

<?php
// 设置数据
$table->set('user_1', [
    'id' => 1,
    'name' => '张三',
    'score' => 95.5
]);
// 获取数据
$data = $table->get('user_1');
print_r($data);
// 更新数据
$table->set('user_1', [
    'name' => '李四',
    'score' => 98.5
]);
// 删除数据
$table->del('user_1');
// 检查键是否存在
if ($table->exist('user_1')) {
    echo "存在";
}
// 获取表大小
$size = $table->count();
// 清空表
$table->destroy();

原子操作

Swoole Table 支持原子操作,适合并发场景:

<?php
$table = new Swoole\Table(1024);
$table->column('counter', Swoole\Table::TYPE_INT);
$table->column('string_data', Swoole\Table::TYPE_STRING, 64);
$table->create();
// 原子自增
$table->incr('counter', 'counter', 1); // key, column, step
// 原子自减
$table->decr('counter', 'counter', 1);
// 原子替换字符串(需要 TYPE_STRING 类型)
$table->set('str', ['string_data' => 'hello']);
$table->set('str', ['string_data' => 'world']); // 直接覆盖

协程环境中的使用

<?php
use Swoole\Coroutine;
use Swoole\Table;
$table = new Table(1024);
$table->column('data', Table::TYPE_STRING, 256);
$table->create();
// 在协程中并发操作
Coroutine\run(function () use ($table) {
    // 创建多个协程并发写入
    for ($i = 0; $i < 10; $i++) {
        Coroutine::create(function () use ($table, $i) {
            $table->set("key_$i", ['data' => "value_$i"]);
            echo "写入 key_$i\n";
        });
    }
    // 等待所有写入完成
    Co::sleep(0.1);
    // 读取数据
    for ($i = 0; $i < 10; $i++) {
        $result = $table->get("key_$i");
        if ($result) {
            echo "读取 key_$i: " . $result['data'] . "\n";
        }
    }
});

实际应用示例

示例:在线用户管理

<?php
class OnlineUserManager
{
    private $table;
    public function __construct()
    {
        // 创建用户表
        $this->table = new Swoole\Table(1024);
        $this->table->column('user_id', Swoole\Table::TYPE_INT);
        $this->table->column('username', Swoole\Table::TYPE_STRING, 64);
        $this->table->column('login_time', Swoole\Table::TYPE_INT);
        $this->table->column('last_active', Swoole\Table::TYPE_INT);
        $this->table->column('ip', Swoole\Table::TYPE_STRING, 45);
        $this->table->create();
    }
    public function userLogin($userId, $username, $ip)
    {
        $time = time();
        $this->table->set($userId, [
            'user_id' => $userId,
            'username' => $username,
            'login_time' => $time,
            'last_active' => $time,
            'ip' => $ip
        ]);
    }
    public function updateActivity($userId)
    {
        if ($this->table->exist($userId)) {
            $this->table->set($userId, [
                'last_active' => time()
            ]);
        }
    }
    public function userLogout($userId)
    {
        $this->table->del($userId);
    }
    public function getUserInfo($userId)
    {
        return $this->table->get($userId);
    }
    public function getOnlineCount()
    {
        return $this->table->count();
    }
    public function getOnlineUsers()
    {
        $users = [];
        foreach ($this->table as $key => $value) {
            $users[] = $value;
        }
        return $users;
    }
}
// 使用示例
$manager = new OnlineUserManager();
$manager->userLogin(1, '张三', '192.168.1.100');
$manager->userLogin(2, '李四', '192.168.1.101');
echo "在线用户数: " . $manager->getOnlineCount() . PHP_EOL;
$info = $manager->getUserInfo(1);
echo "用户信息: " . json_encode($info) . PHP_EOL;
print_r($manager->getOnlineUsers());

示例:简单计数器服务

<?php
class CounterService
{
    private $table;
    public function __construct()
    {
        $this->table = new Swoole\Table(1024);
        $this->table->column('count', Swoole\Table::TYPE_INT);
        $this->table->create();
        // 初始化
        $this->table->set('total', ['count' => 0]);
    }
    public function increment()
    {
        return $this->table->incr('total', 'count', 1);
    }
    public function getCount()
    {
        $result = $this->table->get('total');
        return $result ? $result['count'] : 0;
    }
    public function reset()
    {
        $this->table->set('total', ['count' => 0]);
    }
}
// 在 Swoole 服务中使用
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$counter = new CounterService();
$server->on('Request', function ($request, $response) use ($counter) {
    $count = $counter->increment();
    $response->end("当前计数: $count");
});
$server->start();

注意事项

  1. 内存限制:Table 的内存是在共享内存中分配的,需要合理设置大小
  2. 行数限制:创建时需要指定最大行数,超出后会覆盖旧数据(取决于 conflict_proportion
  3. 数据类型:支持 INT、STRING、FLOAT 三种类型
  4. 字符串长度:STRING 类型需要指定最大长度
  5. 性能特点:TABLE 适用于小数据量的快速读写,不适合存储大型数据

高级配置

<?php
// 参数说明
$table = new Swoole\Table(
    1024,           // 最大行数
    0.5,            // conflict_proportion 冲突比例,默认 0.5
    0,              // 内存大小(单位:字节),0 表示自动计算
    4               // 每个 Key 的额外内存
);
$table->column('data1', Swoole\Table::TYPE_STRING, 128);
$table->create();

这种高性能的内存表非常适合用于用户 session、计数器、缓存等场景,能显著提升应用性能。

抱歉,评论功能暂时关闭!