数据库

框架模式使用 medoo 框架,提供最简便的操作。如果想使用 ORM 的朋友可以尝试添加 ServiceProvider,作为框架的一个扩充。

3.1 版本开始,一维数组结构改为二维数组配置. 数据库操作方面会考虑将 medoo 改为可选扩展,并且会考虑使用其他数据库操作进行替换。ORM 是不会内置到框架中,可能会使用一个扩展进行补充。

基础 medoo 使用

ORM 框架

数据库配置:

  1. <?php
  2. return [
  3. 'default' => [
  4. 'adapter' => 'mysql',
  5. 'name' => 'ci',
  6. 'host' => '127.0.0.1',
  7. 'user' => 'travis',
  8. 'pass' => '',
  9. 'charset' => 'utf8',
  10. 'port' => 3306,
  11. ]
  12. ];

框架提供辅助函数: database(), 函数返回一个 Medoo\Medoo 对象。提供最原始的操作,详细 Medoo 操作文档: Medoo Doc.

数据库模型

框架提供简单的数据库模型,暂时不提供 ORM 等复杂操作,因为本身定位不在此处,如果想要使用 ORM 等操作,可以通过自定义 服务提供器 来扩展。

模型没有强制要求继承 FastD\Model\Model,但是在每个模型初始化的时候,会默认在构造方法中注入 medoo 对象,分配在 db 属性当中。

  1. $model = model('demo');

模型放置在 Model 目录中,如果没有该目录,需要通过手动创建目录,通过使用 model 方法的时候,会自动将命名空间拼接到模型名之前,并且模型名不需要带上 Model 字样,如: model('demo'') 等于 new Model\DemoModel

数据表结构

从 3.1 版本开始支持构建简单的数据表模型,通过简单命令构建基础的数据表模型。

  1. $ php bin/console seed:create Hello

文件构建在 database 目录下,名字自动构建如下:

  1. <?php
  2. use FastD\Model\Migration;
  3. use Phinx\Db\Table;
  4. class Hello extends Migration
  5. {
  6. /**
  7. * Set up database table schema
  8. */
  9. public function setUp()
  10. {
  11. // create table
  12. $table = $this->table('demo');
  13. $table->addColumn('user_id', 'integer')
  14. ->addColumn('created', 'datetime')
  15. ->create();
  16. }
  17. public function dataSet(Table $table) {
  18. }
  19. }

通过实现 setUp 方法,添加数据库结构,方便表结构迁移。

编写完成初步的表结构,运行命令:

  1. $ php bin/console seed:run

自动构建数据表,但是需要先手动创建数据库。具体操作可参考: phinx

连接池

当实现 Swoole 服务的时候,数据库会启动一个连接池,在 onWorkerStart 启动时候连接数据库,并且在操作时候,检查连接是否断开,实现断线重连机制,断线重连注意事项: MySQL断线重连

实现原理:

框架提供 PoolInterface 接口类,实现 initPool 方法。

  1. <?php
  2. namespace FastD\Pool;
  3. use FastD\Model\Database;
  4. /**
  5. * Class DatabasePool.
  6. */
  7. class DatabasePool implements PoolInterface
  8. {
  9. /**
  10. * @var Database[]
  11. */
  12. protected $connections = [];
  13. /**
  14. * @var array
  15. */
  16. protected $config;
  17. /**
  18. * Database constructor.
  19. *
  20. * @param array $config
  21. */
  22. public function __construct(array $config)
  23. {
  24. $this->config = $config;
  25. }
  26. /**
  27. * @param $key
  28. *
  29. * @return Database
  30. */
  31. public function getConnection($key)
  32. {
  33. if (!isset($this->connections[$key])) {
  34. if (!isset($this->config[$key])) {
  35. throw new \LogicException(sprintf('No set %s database', $key));
  36. }
  37. $config = $this->config[$key];
  38. $this->connections[$key] = new Database(
  39. [
  40. 'database_type' => isset($config['adapter']) ? $config['adapter'] : 'mysql',
  41. 'database_name' => $config['name'],
  42. 'server' => $config['host'],
  43. 'username' => $config['user'],
  44. 'password' => $config['pass'],
  45. 'charset' => isset($config['charset']) ? $config['charset'] : 'utf8',
  46. 'port' => isset($config['port']) ? $config['port'] : 3306,
  47. 'prefix' => isset($config['prefix']) ? $config['prefix'] : '',
  48. ]
  49. );
  50. }
  51. return $this->connections[$key];
  52. }
  53. /**
  54. * {@inheritdoc}
  55. */
  56. public function initPool()
  57. {
  58. foreach ($this->config as $name => $config) {
  59. $this->getConnection($name);
  60. }
  61. }
  62. }
  1. <?php
  2. // ...
  3. public function onWorkerStart()
  4. {
  5. foreach (app() as $service) {
  6. if ($service instanceof FastD\Pool\PoolInterface) {
  7. $service->initPool();
  8. }
  9. }
  10. }
  11. // ...

下一节: 缓存