Guida rapida al database (basata sul componente database di Laravel)
webman/database è sviluppato basandosi su illuminate/database e include funzionalità di pooling delle connessioni, supportando ambienti sia basati su coroutine che non; l'uso è identico a quello di Laravel.
Gli sviluppatori possono anche fare riferimento alla sezione Utilizzare altri componenti di database per utilizzare ThinkPHP o altri database.
Attenzione
Questo manuale è per la versione webman-v2, se stai utilizzando la versione webman-v1, ti preghiamo di consultare il manuale della versione v1
Installazione del database
composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper
Dopo l'installazione è necessario riavviare (reload non è efficace)
Suggerimento
webman/database dipende dailluminate/database
di Laravel, quindi durante l'installazione verranno installati automaticamente i pacchetti di dipendenza diilluminate/database
.Attenzione
Se non hai bisogno di paginazione, eventi di database o registrazione SQL, è sufficiente eseguire
composer require -W webman/database
Configurazione del database
config/database.php
return [
// Database predefinito
'default' => 'mysql',
// Configurazioni per vari database
'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, // Necessario quando si utilizza swoole o swow come driver
],
'pool' => [ // Configurazione del pool di connessioni
'max_connections' => 5, // Numero massimo di connessioni
'min_connections' => 1, // Numero minimo di connessioni
'wait_timeout' => 3, // Tempo massimo di attesa per ottenere una connessione dal pool, dopo il quale verrà sollevata un'eccezione. Efficace solo in un ambiente di coroutine
'idle_timeout' => 60, // Tempo massimo di inattività per le connessioni nel pool, dopo il quale verranno chiuse e recuperate, fino a quando il numero di connessioni non è pari a min_connections
'heartbeat_interval' => 50, // Intervallo di controllo del cuore nel pool di connessioni, in secondi, si consiglia di mantenerlo inferiore a 60 secondi
],
],
],
];
Oltre alla configurazione pool
, le altre configurazioni sono identiche a quelle di Laravel.
Riguardo al pool di connessione
- Ogni processo ha il proprio pool di connessioni, le connessioni non sono condivise tra i processi.
- Se le coroutine non sono attivate, le operazioni vengono eseguite in sequenza all'interno del processo, non si verificano concorrenze, quindi il pool di connessioni avrà al massimo 1 connessione.
- Attivando le coroutine, le operazioni saranno eseguite in modo concorrente nel processo, il pool di connessioni regolerà dinamicamente il numero di connessioni in base alle necessità, non superando
max_connections
e non scendendo sottomin_connections
. - Poiché il numero massimo di connessioni del pool è
max_connections
, quando il numero di coroutine che operano sul database superamax_connections
, alcune coroutine dovranno attendere, con un massimo di attesa diwait_timeout
secondi, altrimenti verrà sollevata un'eccezione. - In stato di inattività (compresi gli ambienti di coroutine e non), le connessioni verranno recuperate dopo
idle_timeout
, fino a quando il numero di connessioni non scende amin_connections
(min_connections
può essere 0).
Esempio di utilizzo 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");
}
}
Come possiamo vedere, l'uso è identico a Laravel, utilizzando il metodo Db::table()
per interagire con il database.