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 deilluminate/database
de Laravel, por lo que al instalar, automáticamente se instalarán los paquetes dependientes deilluminate/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 quemin_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 quemax_connections
, habrá corrutinas en cola esperando, pudiendo esperar como máximowait_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 amin_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.