Guida rapida al database (componente Laravel)
webman/database si basa su illuminate/database e aggiunge il connection pooling per ambienti con e senza coroutine. L’uso è identico a Laravel.
Puoi anche consultare Uso di altri componenti database per usare ThinkPHP o altri database.
Installazione del database
composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper
Dopo l’installazione è necessario eseguire il restart (reload non è sufficiente).
Suggerimento
webman/database dipende dailluminate/databasedi Laravel, quindi le dipendenze vengono installate automaticamente.Nota
Se non ti servono paginazione, eventi database o logging SQL, basta eseguire:
composer require -W webman/database
Configurazione del database
config/database.php
return [
// Database predefinito
'default' => 'mysql',
// Configurazioni delle connessioni
'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, // Obbligatorio con swoole o swow
],
'pool' => [ // Configurazione del connection pool
'max_connections' => 5, // Numero massimo di connessioni
'min_connections' => 1, // Numero minimo di connessioni
'wait_timeout' => 3, // Tempo massimo di attesa per una connessione dal pool; superato → eccezione. Solo con coroutine
'idle_timeout' => 60, // Tempo massimo di inattività; poi chiusura fino a min_connections
'heartbeat_interval' => 50, // Intervallo heartbeat del pool in secondi; consigliato < 60
],
],
],
];
Eccetto pool, il resto è uguale a Laravel.
Sul connection pool
- Ogni processo ha il proprio pool; i pool non sono condivisi tra processi.
- Senza coroutine le richieste vengono eseguite in sequenza, nessuna concorrenza, quindi al massimo una connessione nel pool.
- Con coroutine le richieste sono parallele; il pool regola dinamicamente il numero di connessioni, senza superare
max_connectionsné scendere sottomin_connections. - Dato che il pool ha al massimo
max_connections, quando le coroutine che usano il database sono di più, alcune attendono in coda fino await_timeoutsecondi; oltre scatta un’eccezione. - In idle (con o senza coroutine), le connessioni vengono recuperate dopo
idle_timeoutfino a raggiungeremin_connections(min_connectionspuò essere 0).
Esempio d’uso del database
<?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");
}
}
L’uso è uguale a Laravel: il metodo Db::table() per operare sul database.