dustingraham / react-mysql
使用 PHP 实现非阻塞 MySQLi 数据库访问。旨在与 reactphp/react 一起使用。
Requires
- php: >=5.4.0
- ext-mysqli: *
- react/event-loop: ^0.4.2
- react/promise: ^2.4
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2021-01-19 23:21:37 UTC
README
使用 PHP 实现非阻塞 MySQLi 数据库访问。旨在与 reactphp/react 一起使用。
快速入门
$db = new \DustinGraham\ReactMysql\Database(
['localhost', 'apache', 'apache', 'react_mysql_test']
);
$db->statement('SELECT * FROM simple_table WHERE id = :test', [':test' => 2])
->then(function(\mysqli_result $result)
{
$rows = $result->fetch_all(MYSQLI_ASSOC);
});
$db->shuttingDown = true;
$db->loop->run();
将 shuttingDown 设置为 true 将允许循环在查询解决后退出。
工作
这正在工作。但还远远没有完成。请查看示例文件以及单元测试以获取更多示例。
$ ./example
Creating database....done!
Run Query: 0
Found rows: 0
Run Query: 1
Found rows: 1
Current memory usage: 868.164K
Run Query: 2
Found rows: 1
Run Query: 3
Found rows: 1
Run Query: 4
Found rows: 0
Current memory usage: 868.164K
Run Query: 5
Found rows: 0
Current memory usage: 865.719K
Current memory usage: 865.719K
Current memory usage: 865.719K
Loop finished, all timers halted.
如果不配置数据库,则无法直接使用。您还需要设置一个包含查询数据的数据库。
单元测试
示例和单元测试期望一个名为 react_mysql_test 的数据库,每次运行时都会创建适当的表。它还期望 localhost 和用户 apache,密码 apache。
待办事项
这不是生产就绪。查询构建器还有很多工作要做。虽然我不喜欢重复造轮子,但我还没有找到一个轻量级的可注入查询构建器,它不与大型框架相关联。
计划(未来示例)
这些只是目前的计划。随着我们的开发,它可能会发生巨大变化。
当前开发示例
以下是目前大部分正常工作的示例。
$db = new \DustinGraham\ReactMysql\Database(
['localhost', 'apache', 'apache', 'react_mysql_test']
);
$db->statement('SELECT * FROM simple_table WHERE id = :test', [':test' => 2])
->then(function(\mysqli_result $result)
{
$rows = $result->fetch_all(MYSQLI_ASSOC);
// Do something with $rows.
});
$db->shuttingDown = true;
$db->loop->run();
原始的大图计划
这里是一些可能最终成为的示例。隐藏一些当前的样板代码将很棒。
Connection::init($loop, ['db_host', 'db_user', 'db_pass', 'db_name']);
Connection::query(
'SELECT * FROM `table` WHERE `column` = ? AND `column2` = ?;',
['red', 'white']
)->then(function($result) { ... });
Connection::query(...) returns a promise.
$db = new Database();
$db->createCommand('SELECT * FROM table WHERE id = :id', [':id' => 1])
->execute()
->then(function($results) {
echo $results[0]->name;
});
还有另一个想法...
DB::loadModel('id', ' =', '3')->then(function($model) use ($socket) {
$socket->send('Your name is '.$model->name);
});
困难
有很多困难。
到目前为止,我没有找到任何可以不使用 PDO 或预处理语句处理参数化查询的库。
MYSQLI_ASYNC 不支持预处理语句和参数绑定。因此,我们必须自己编写它。
mysqli::real_escape_string 需要一个链接。但是,链接是许多链接之一。在命令和连接从池中结合在一起的最后时刻进行最后时刻的转义。可能需要一个专门的链接来进行转义。
查询构建支持
已经分析了许多 MySQL 封装包,但没有一个是完全独立于可找到的连接对象的。
目前,我们将转义参数,但要求用户提供一个包含引号参数的 SQL 查询。
这显然是不理想的,因为像 $created_at 这样的变量可能是 NOW()、'2016-01-01' 或 NULL。
我一直使用的试金石查询如下
INSERT INTO `simple_table` (`id`, `name`, `value`, `created_at`)
VALUES (NULL, 'John\'s Name', 7, NOW());
这里的关键点是
- 支持将参数放在引号中!这是第一步。其余的是智能地知道何时不引号。
- 支持将空值转换为 NULL。
- 支持使用单引号'或双引号''来转义参数。
- 支持不转义函数,如NOW()。
- 支持识别整数值。这是可选的,因为'7'也可以正常工作。
包装器选项已审查
- nilportugues/php-sql-query-builder - 无需连接!但,语法有些奇怪。
- usmanhalalit/pixie - 需要连接。非常接近需求。
- joshcam/PHP-MySQLi-Database-Class - 需要连接。
- aviat4ion/Query - 需要连接。
- rkrx/php-mysql-query-builder - 需要连接。
- stefangabos/Zebra_Database - 需要连接,功能多于所需。
- indeyets/MySQL-Query-Builder - 未维护。语法有些奇怪。
nilportugues/php-sql-query-builder包非常接近,但它没有引号参数。
安装
推荐通过Composer安装此库。
$ composer require dustingraham/react-mysql
需要PHP 5.4和php ext-mysqli扩展。
致谢
非常感谢在reactphp/react上的辛勤工作。
受类似项目启发
许可
DustinGraham/ReactMysql在MIT许可证下发布。