Guia rápido do banco de dados (baseado no componente Laravel)
webman/database é baseado em illuminate/database e adiciona pool de conexões para ambientes com e sem corrotinas. O uso é igual ao do Laravel.
Você também pode consultar Uso de outros componentes de banco de dados para usar ThinkPHP ou outros bancos.
Instalação do banco de dados
composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper
É necessário reiniciar após a instalação (reload não funciona).
Dica
webman/database depende doilluminate/databasedo Laravel, então as dependências são instaladas automaticamente.Nota
Se não precisar de paginação, eventos de banco de dados ou registro de SQL, basta 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 conexões
'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
],
'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, // Tempo máximo de espera ao obter conexão do pool; excede → exceção. Só em ambiente corrotina
'idle_timeout' => 60, // Tempo máximo de ociosidade das conexões; depois são fechadas até min_connections
'heartbeat_interval' => 50, // Intervalo de heartbeat do pool em segundos; recomendado < 60
],
],
],
];
Exceto a configuração pool, o restante é igual ao Laravel.
Sobre o pool de conexões
- Cada processo tem seu próprio pool; os pools não são compartilhados entre processos.
- Sem corrotinas as requisições são executadas em sequência, não há concorrência, então o pool terá no máximo uma conexão.
- Com corrotinas as requisições rodam em paralelo; o pool ajusta o número de conexões dinamicamente, sem exceder
max_connectionsnem ficar abaixo demin_connections. - Como o pool está limitado a
max_connections, quando há mais corrotinas usando o banco, algumas aguardam na fila atéwait_timeoutsegundos; excedendo, uma exceção é lançada. - Em ociosidade (com ou sem corrotinas), as conexões são devolvidas após
idle_timeoutaté atingirmin_connections(min_connectionspode 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");
}
}
O uso é igual ao Laravel: o método Db::table() para operar no banco de dados.