cloudtay / ripple-database
v1.0.0
2025-09-30 14:28 UTC
Requires
- ext-openssl: *
- ext-pdo: *
- cloudtay/ripple-kernel: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.87
- phpunit/phpunit: ^9.6
README
⚡️ 高性能数据库连接池, 完美兼容PDO接口, 内置连接池
驱动类型 | 支持 |
---|---|
MySQL |
已支持 |
... |
暂无 |
一键安装
composer require cloudtay/ripple-database
快速开始
<?php declare(strict_types=1); require __DIR__ . '/../vendor/autoload.php'; use Ripple\Database\PDO; $dsn = "mysql:host=127.0.0.1;port=3306;dbname=test_db;charset=utf8mb4"; $pdo = new PDO($dsn, 'root', '123456'); // 创建表 $pdo->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 |
连接超时时间(秒) |
$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的行为完全一致:
// 测试覆盖的数据类型 $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 declare(strict_types=1); require __DIR__ . '/../vendor/autoload.php'; use Ripple\Database\PDOPool; use Ripple\Sync\Channel; use Ripple\Sync\WaitGroup; use function Co\go; $dsn = "mysql:host=127.0.0.1;port=3306;dbname=test_db;charset=utf8mb4"; $pdo = new PDOPool($dsn, 'root', '123456', [ 'pool_max' => 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 use Ripple\Database\PDO; $pdo = new PDO($dsn, 'root', '123456'); try { $pdo->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 jingnigg@gmail.com