Introdução Rápida ao Banco de Dados (Baseado no Componente de Banco de Dados do Laravel)

webman/database é desenvolvido com base em illuminate/database e adiciona a funcionalidade de pool de conexões, suportando ambientes de coorte e não coorte, com uma utilização semelhante ao Laravel.

Os desenvolvedores também podem consultar o capítulo Usando Outros Componentes de Banco de Dados para utilizar ThinkPHP ou outros bancos de dados.

Nota
Este manual é para a versão webman-v2. Se você estiver usando a versão webman-v1, consulte o manual da versão v1.

Instalação do Banco de Dados

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

Após a instalação, é necessário reiniciar (reload não é suficiente).

Dica
O webman/database depende do illuminate/database, então ao instalar, as dependências de illuminate/database serão instaladas automaticamente.

Nota
Se não precisar de paginação, eventos de banco de dados ou registro de SQL, você só precisa executar
composer require -W webman/database.

Configuração do Banco de Dados

config/database.php


return [
    // Banco de dados padrão
    'default' => 'mysql',

    // Configurações de vários bancos de dados
    '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, // Necessário ao usar swoole ou swow como driver
            ],
            'pool' => [ // Configuração do pool de conexões
                'max_connections' => 5, // Número máximo de conexões
                'min_connections' => 1, // Número mínimo de conexões
                'wait_timeout' => 3,    // O tempo máximo de espera para obter uma conexão do pool; após o tempo limite, uma exceção será lançada. Somente válido em ambiente de coorte
                'idle_timeout' => 60,   // O tempo máximo ocioso das conexões no pool; após o tempo limite, será fechado e reciclado, até que o número de conexões seja igual a min_connections
                'heartbeat_interval' => 50, // Tempo de verificação de heartbeat do pool de conexões, em segundos; recomenda-se que seja menor que 60 segundos
            ],
        ],
    ],
];

Exceto pela configuração pool, as outras configurações são as mesmas do Laravel.

Sobre o Pool de Conexões

  • Cada processo possui seu próprio pool de conexões, e os pools de conexões não são compartilhados entre processos.
  • Quando as corrotinas não estão habilitadas, os negócios são executados em fila dentro do processo e não ocorrem concorrências, portanto o pool de conexões terá no máximo 1 conexão.
  • Quando as corrotinas estão habilitadas, os negócios são executados de forma concorrente dentro do processo, e o pool de conexões ajustará dinamicamente o número de conexões conforme necessário, com um máximo igual a max_connections e um mínimo igual a min_connections.
  • Devido ao número máximo de conexões do pool ser max_connections, quando o número de corrotinas que operam no banco de dados excede max_connections, algumas corrotinas ficarão esperando, no máximo por wait_timeout segundos, e se exceder esse período, uma exceção será disparada.
  • Em condições ociosas (incluindo ambientes de coorte e não coorte), as conexões serão recicladas após o tempo idle_timeout, até que o número de conexões seja igual a min_connections (min_connections pode ser 0).

Exemplo de Uso do Banco de Dados

<?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");
    }
}

Podemos ver que a utilização é semelhante à do Laravel, usando o método Db::table() para operar no banco de dados.