本文目录导读:

- 数组作为最简单的内存表
- 使用 SPL 集合类
- 使用第三方库(如 MemoryTable)
- 使用 PDO 与内存数据库
- Redis 作为内存表(分布式场景)
- 高性能场景 - 使用 PHP 扩展
- 最佳实践建议
- 注意事项
在 PHP 中,“内存表”通常指的是将数据存储在内存中的表格/数据结构,而不是指 MySQL 的 MEMORY 存储引擎表,PHP 有几种常见的内存表实现方式:
数组作为最简单的内存表
<?php
// 最简单的内存表 - 使用数组
$userTable = [
['id' => 1, 'name' => '张三', 'age' => 25],
['id' => 2, 'name' => '李四', 'age' => 30],
['id' => 3, 'name' => '王五', 'age' => 28]
];
// 查询操作
$findUser = array_filter($userTable, function($user) {
return $user['id'] === 2;
});
// 插入操作
$userTable[] = ['id' => 4, 'name' => '赵六', 'age' => 22];
// 更新操作
foreach ($userTable as &$user) {
if ($user['id'] === 2) {
$user['age'] = 31;
}
}
unset($user);
?>
使用 SPL 集合类
<?php // 使用 SplFixedArray - 固定大小的数组,更节省内存 $table = new SplFixedArray(3); $table[0] = ['id' => 1, 'name' => '张三']; $table[1] = ['id' => 2, 'name' => '李四']; $table[2] = ['id' => 3, 'name' => '王五']; // 使用 SplObjectStorage - 对象存储 $storage = new SplObjectStorage(); $user1 = new stdClass(); $user1->name = '张三'; $storage->attach($user1, ['age' => 25]); ?>
使用第三方库(如 MemoryTable)
<?php
// 使用 MemoryTable 类库
require 'vendor/autoload.php';
use MemoryTable\Table;
// 创建内存表
$table = new Table([
'name' => 'string',
'age' => 'int',
'email' => 'string'
]);
// 插入数据
$table->insert([
'name' => '张三',
'age' => 25,
'email' => 'zhangsan@example.com'
]);
// 查询数据
$result = $table->where('age', '>', 20)->get();
// 更新数据
$table->where('name', '张三')->update(['age' => 26]);
// 删除数据
$table->where('age', '<', 20)->delete();
?>
使用 PDO 与内存数据库
<?php
// 使用 SQLite 内存数据库
$pdo = new PDO('sqlite::memory:');
// 创建内存表
$pdo->exec("CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
)");
// 插入数据
$stmt = $pdo->prepare("INSERT INTO users (name, age) VALUES (?, ?)");
$stmt->execute(['张三', 25]);
// 查询数据
$result = $pdo->query("SELECT * FROM users WHERE age > 20");
$users = $result->fetchAll(PDO::FETCH_ASSOC);
?>
Redis 作为内存表(分布式场景)
<?php
// 使用 Redis 作为内存表
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 使用 Hash 存储表数据
$redis->hSet('user:1', 'name', '张三');
$redis->hSet('user:1', 'age', 25);
$redis->hSet('user:2', 'name', '李四');
$redis->hSet('user:2', 'age', 30);
// 查询
$user1 = $redis->hGetAll('user:1');
?>
高性能场景 - 使用 PHP 扩展
<?php
// 使用 swoole_table (Swoole 扩展)
$table = new Swoole\Table(1024);
$table->column('name', Swoole\Table::TYPE_STRING, 64);
$table->column('age', Swoole\Table::TYPE_INT, 4);
$table->create();
// 设置数据(默认是加锁的)
$table->set('user1', ['name' => '张三', 'age' => 25]);
$table->set('user2', ['name' => '李四', 'age' => 30]);
// 获取数据
$data = $table->get('user1');
print_r($data);
// 原子递增
$table->incr('user1', 'age', 1);
/**
* 也可使用 W 模式,提供更快的性能
*/
$table->set('user2', ['name' => '王五', 'age' => 28], Swoole\Table::TABLE_MODE_W);
?>
最佳实践建议
根据场景选择合适的方式:
| 场景 | 推荐方案 |
|---|---|
| 小数据量(<1000条) | PHP 数组 |
| 中等数据量 | SPL 集合类 |
| 需要 SQL 查询功能 | SQLite 内存数据库 |
| 分布式系统 | Redis |
| 高并发、高性能 | Swoole Table |
性能对比示例:
<?php
// 测试不同实现的性能
class MemoryTableTest {
public static function testArray() {
$start = microtime(true);
$data = [];
for ($i = 0; $i < 100000; $i++) {
$data[$i] = ['id' => $i, 'name' => "User{$i}"];
}
return microtime(true) - $start;
}
public static function testSQLite() {
$start = microtime(true);
$pdo = new PDO('sqlite::memory:');
$pdo->exec("CREATE TABLE users (id INT, name TEXT)");
$stmt = $pdo->prepare("INSERT INTO users (id, name) VALUES (?, ?)");
for ($i = 0; $i < 100000; $i++) {
$stmt->execute([$i, "User{$i}"]);
}
return microtime(true) - $start;
}
}
?>
注意事项
- 内存限制:PHP 默认内存限制为 128M,可通过
ini_set('memory_limit', '1G')调整 - 数据持久化:内存数据在请求结束后会消失,需要持久化时考虑 Redis 或文件存储
- 并发访问:多进程场景下需要加锁或使用专门的并发工具(如 Swoole)