An open API service indexing awesome lists of open source software.

https://github.com/cloudtay/ripple-database

High-performance database connection pool, perfectly compatible with PDO interface, built-in connection pool
https://github.com/cloudtay/ripple-database

Last synced: 9 months ago
JSON representation

High-performance database connection pool, perfectly compatible with PDO interface, built-in connection pool

Awesome Lists containing this project

README

          

# Ripple DB

⚡️ 高性能数据库连接池, 完美兼容PDO接口, 内置连接池

| 驱动类型 | 支持 |
|---------|-----|
| `MySQL` | 已支持 |
| `...` | 暂无 |

## 一键安装

```bash
composer require cloudtay/ripple-database
```

### 快速开始

```php
exec("CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE
)");

// 预处理语句
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(['Alice', 'alice@example.com']);

// 查询数据
$result = $pdo->query("SELECT * FROM users WHERE name = 'Alice'")->fetch();
echo "User: {$result['name']} - {$result['email']}\n";
```

#### 连接选项

| 配置项 | 类型 | 默认值 | 描述 |
|---------------------------|-----|-------|-----------|
| ... | ... | | PDO默认选项类表 |
| `pool_max` | 整数 | `20` | 最大连接数 |
| `pool_min` | 整数 | `5` | 最小连接数 |
| `pool_connection_timeout` | 整数 | `300` | 连接超时时间(秒) |

```php
$pool = new PDOPool($dsn, $user, $password, [
// PDO选项
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

// 连接池选项
'pool_max' => 20, // 最大连接数,自动扩容
'pool_min' => 5, // 最小连接数,初始化时自动连接
'pool_connection_timeout' => 300, // 连接超时时间(惰性检查)
]);
```

## 兼容性

### 已兼容的PDO方法

| 方法名 | 描述 | 支持状态 |
|------------------------------|--------------|-------|
| `PDO::prepare()` | 预处理语句 | 支持 |
| `PDO::query()` | 执行查询 | 支持 |
| `PDO::exec()` | 执行语句并返回受影响行数 | 支持 |
| `PDO::lastInsertId()` | 获取最后插入 ID | 支持 |
| `PDO::beginTransaction()` | 开始事务 | 支持 |
| `PDO::commit()` | 提交事务 | 支持 |
| `PDO::rollBack()` | 回滚事务 | 支持 |
| `PDO::inTransaction()` | 检查是否在事务中 | 支持 |
| `PDO::setAttribute()` | 设置PDO属性 | 支持 |
| `PDO::getAttribute()` | 获取PDO属性 | 支持 |
| `PDO::errorCode()` | 获取错误代码 | 支持 |
| `PDO::errorInfo()` | 获取错误信息 | 支持 |
| `PDO::getAvailableDrivers()` | 获取可用驱动列表 | 支持 |
| `PDO::status()` | 获取连接池状态信息 | 连接池独有 |
| `PDO::close()` | 关闭连接池 | 连接池独有 |
| `PDO::quote()` | 引号转义 | 不支持 |

### 类型兼容性

与原生PDO在数据类型处理上完全一致, 确保数据存储和检索的准确性。

| 数据类型 | MySQL 类型 | 强等于校验 |
|---------|-------------------------------------------------|-------|
| 整数类型 | `TINYINT`, `SMALLINT`, `INT`, `BIGINT` | 通过 |
| 浮点类型 | `FLOAT`, `DOUBLE`, `DECIMAL` | 通过 |
| 字符串类型 | `CHAR`, `VARCHAR`, `TEXT` | 通过 |
| 二进制类型 | `BLOB` | 通过 |
| JSON 类型 | `JSON` | 通过 |
| 日期时间 | `DATE`, `DATETIME`, `TIMESTAMP`, `TIME`, `YEAR` | 通过 |
| 布尔类型 | `BOOLEAN` | 通过 |
| 枚举类型 | `ENUM`, `SET` | 通过 |

项目包含完整的类型兼容性测试, 确保与原生PDO的行为完全一致:

```php
// 测试覆盖的数据类型
$testData = [
'tiny_col' => 1, // TINYINT
'small_col' => 32000, // SMALLINT
'int_col' => 2147483647, // INT
'big_col' => 9223372036854775807, // BIGINT
'float_col' => 3.14159, // FLOAT
'double_col' => 2.718281828459, // DOUBLE
'decimal_col' => '12345.67', // DECIMAL
'char_col' => 'char_text', // CHAR
'varchar_col' => 'varchar_text', // VARCHAR
'text_col' => 'this is text', // TEXT
'blob_col' => random_bytes(16), // BLOB
'json_col' => json_encode(['a' => 1, 'b' => 2]), // JSON
'date_col' => '2025-09-20', // DATE
'datetime_col' => '2025-09-20 19:00:00', // DATETIME
'timestamp_col' => '2025-09-20 19:00:00', // TIMESTAMP
'time_col' => '12:34:56', // TIME
'year_col' => 2025, // YEAR
'bool_col' => 1, // BOOLEAN
'enum_col' => 'b', // ENUM
'set_col' => 'x,y', // SET
'emoji_col' => '😀🚀✨' // UTF-8 Emoji
];
```

## 用法示例

### 连接池使用

```php
10,
'pool_min' => 2
]);

$channel = new Channel(10);
for ($i = 0; $i < 10; $i++) {
go(static function () use ($pdo, $channel) {
$result = $pdo->query("SELECT SLEEP(1);");
$channel->send($result);
});
}

while ($result = $channel->receive()) {
echo json_encode($result->fetch(), JSON_UNESCAPED_UNICODE) . PHP_EOL;
}
```

### 事务处理

```php
beginTransaction();

$stmt1 = $pdo->prepare("UPDATE accounts SET balance = balance - ? WHERE name = ?");
$stmt1->execute([100.00, 'Alice']);

$stmt2 = $pdo->prepare("UPDATE accounts SET balance = balance + ? WHERE name = ?");
$stmt2->execute([100.00, 'Bob']);

$pdo->commit();
echo "Transaction completed successfully\n";

} catch (Exception $e) {
$pdo->rollback();
echo "Transaction failed: " . $e->getMessage() . "\n";
}
```

## 许可证

MIT License

## 作者

cclilshy