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 doilluminate/database
, então ao instalar, as dependências deilluminate/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 amin_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 excedemax_connections
, algumas corrotinas ficarão esperando, no máximo porwait_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 amin_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.