Guía Rápida de Base de Datos (Basado en el Componente de Base de Datos de Laravel)

webman/database está desarrollado sobre illuminate/database y añade una función de conexión de pool, soportando entornos de corrutinas y no corrutinas, y su uso es el mismo que en Laravel.

Los desarrolladores también pueden consultar el capítulo Uso de Otros Componentes de Base de Datos para utilizar ThinkPHP u otras bases de datos.

Nota
Este manual es para la versión webman-v2, si estás utilizando la versión webman-v1, por favor consulta el manual de la versión v1.

Instalación de Base de Datos

composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper

Después de la instalación, es necesario reiniciar (reload no es efectivo).

Sugerencia
webman/database depende de illuminate/database de Laravel, por lo que al instalar, automáticamente se instalarán los paquetes dependientes de illuminate/database.

Nota
Si no necesitas paginación, eventos de base de datos, o registrar SQL, solo necesitas ejecutar
composer require -W webman/database.

Configuración de Base de Datos

config/database.php


return [
    // Base de datos predeterminada
    'default' => 'mysql',

    // Configuración de varias bases de datos
    'connections' => [
        'mysql' => [
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'test',
            'username'    => 'root',
            'password'    => '',
            'unix_socket' => '',
            'charset'     => 'utf8',
            'collation'   => 'utf8_unicode_ci',
            'prefix'      => '',
            'strict'      => true,
            'engine'      => null,
            'options' => [
                PDO::ATTR_EMULATE_PREPARES => false, // Esto es obligatorio al usar swoole o swow como controlador
            ],
            'pool' => [ // Configuración del pool de conexiones
                'max_connections' => 5, // Número máximo de conexiones
                'min_connections' => 1, // Número mínimo de conexiones
                'wait_timeout' => 3,    // Tiempo máximo de espera para obtener una conexión del pool, se lanzará una excepción si se supera. Solo efectivo en entorno de corrutinas
                'idle_timeout' => 60,   // Tiempo máximo de inactividad de una conexión en el pool, se cerrará y reciclará después de un tiempo de espera, hasta que el número de conexiones sea igual a min_connections
                'heartbeat_interval' => 50, // Tiempo de verificación de latido del pool de conexiones, en segundos, se recomienda que sea menor a 60 segundos
            ],
        ],
    ],
];

Excepto por la configuración de pool, el resto de la configuración es igual que en Laravel.

Acerca del Pool de Conexiones

  • Cada proceso tiene su propio pool de conexiones, no hay compartición del pool entre procesos.
  • Si no se habilitan las corrutinas, las operaciones se ejecutan en cola dentro del proceso, no habrá concurrencia, por lo que el pool de conexiones tendrá como máximo 1 conexión.
  • Al habilitar las corrutinas, las operaciones se ejecutan de manera concurrente dentro del proceso, el pool de conexiones ajustará dinámicamente el número de conexiones según sea necesario, no superando max_connections y no siendo menor que min_connections.
  • Debido a que el número máximo de conexiones en el pool es max_connections, cuando el número de corrutinas que operan la base de datos es mayor que max_connections, habrá corrutinas en cola esperando, pudiendo esperar como máximo wait_timeout segundos, superando lo cual lanzará una excepción.
  • En estado de inactividad (tanto en ambientes de corrutinas como no corrutinas), las conexiones serán recicladas después de un tiempo de idle_timeout, hasta que el número de conexiones sea igual a min_connections (min_connections puede ser 0).

Ejemplo de Uso de Base de Datos

<?php
namespace app\controller;

use support\Request;
use support\Db;

class UserController
{
    public function db(Request $request)
    {
        $default_uid = 29;
        $uid = $request->get('uid', $default_uid);
        $name = Db::table('users')->where('uid', $uid)->value('username');
        return response("hello $name");
    }
}

Como podemos ver, el uso es el mismo que en Laravel, utilizando el método Db::table() para operar con la base de datos.