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 da illuminate/database di Laravel, quindi durante l'installazione verranno installati automaticamente i pacchetti di dipendenza di illuminate/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 sotto min_connections.
  • Poiché il numero massimo di connessioni del pool è max_connections, quando il numero di coroutine che operano sul database supera max_connections, alcune coroutine dovranno attendere, con un massimo di attesa di wait_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 a min_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.