Swoole高性能共享内存使用示例

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
ini_set('memory_limit', '-1');
error_reporting(-1);
set_time_limit(0);
PHP_SAPI !== 'cli' && exit('脚本只能在命令行执行');

// 参数为表格的最大行数,数值必须是2的N次方,否则底层会自动调整为接近的数字,且若小于1024则强制调整1024
// 提醒:最大行数和实际可存储行数是正相关但不完全一致,如本示例设置最大行数为1024,但实际最多只能存463行。
// 警告:必须根据流量和硬件情况设置参数,不能盲目设大,否则会造成内存耗尽而死机。
$table = new Swoole\Table(2 ** 10); // 提示:2**10 = 2^10 = 1024

// 定义表的结构
$table->column('uid', Swoole\Table::TYPE_INT);
$table->column('name', Swoole\Table::TYPE_STRING, 64); // 第三个参数为字符串长度,设置行数据时超过指定数值则会自动截断
$table->column('gender', Swoole\Table::TYPE_STRING, 8); // 第三个参数为字符串长度,设置行数据时超过指定数值则会自动截断
$table->column('birth', Swoole\Table::TYPE_INT);

// 向操作系统申请内存并创建表,如需在Server里使用Table,则Table->create()必须在Server->start()前执行
$table->create();

// 设置行数据(key/value形式)
$table->set('UID_1', ['uid' => 10001, 'name' => '刘一', 'gender' => '男', 'birth' => 2001]);
$table->set('UID_2', ['uid' => 10002, 'name' => '陈二', 'gender' => '女', 'birth' => 2002]);
$table->set('UID_3', ['uid' => 10003, 'name' => '张三', 'gender' => '男', 'birth' => 2003]);
$table->set('UID_4', ['uid' => 10004, 'name' => '李四', 'gender' => '女', 'birth' => 2004]);
$table->set('UID_5', ['uid' => 10005, 'name' => '王五', 'gender' => '男', 'birth' => 2005]);

// 遍历所有行数据
foreach ($table as $row) {
    $uid = $row['uid'];
    $name = $row['name'];
    $gender = $row['gender'];
    $birth = $row['birth'];
    echo "e.g.1 - $uid => 俺叫$name($gender),出生于{$birth}年。" . PHP_EOL;
}
// e.g.1 - 10001 => 俺叫刘一(男),出生于2001年。
// e.g.1 - 10002 => 俺叫陈二(女),出生于2002年。
// e.g.1 - 10003 => 俺叫张三(男),出生于2003年。
// e.g.1 - 10004 => 俺叫李四(女),出生于2004年。
// e.g.1 - 10005 => 俺叫王五(男),出生于2005年。

// 获取指定行数据
$key = 'UID_3';
if ($table->exist($key)) {
    $row = $table->get($key);
    $uid = $row['uid'];
    $name = $row['name'];
    $gender = $row['gender'];
    $birth = $row['birth'];
    echo "e.g.2 - $uid => 俺叫$name($gender),出生于{$birth}年。" . PHP_EOL;
    // e.g.2 - 10003 => 俺叫张三(男),出生于2003年。
}

// 删除指定行数据
$table->del($key);

// 获取行数(由于上面代码删除了一行,所以最新行数为4)
echo '当前行数:' . $table->count() . PHP_EOL; // 当前行数:4

Copyright © 2024 码农人生. All Rights Reserved