Introduction rapide à la base de données (basé sur le composant base de données Laravel)

webman/database est développé sur la base de illuminate/database et ajoute des fonctionnalités de pool de connexions, prenant en charge les environnements coopératifs et non coopératifs, avec une utilisation similaire à Laravel.

Les développeurs peuvent également se référer à la section Utilisation d'autres composants de base de données pour utiliser ThinkPHP ou d'autres bases de données.

Attention
Le manuel actuel est pour la version webman-v2. Si vous utilisez la version webman-v1, veuillez consulter le manuel de la version v1.

Installation de la base de données

composer require -W webman/database illuminate/pagination illuminate/events symfony/var-dumper

Après l'installation, il est nécessaire de redémarrer (reload n'est pas efficace).

Conseil
webman/database dépend de illuminate/database de Laravel, donc lors de l'installation, les paquets dépendants de illuminate/database seront automatiquement installés.

Attention
Si vous n'avez pas besoin de pagination, d'événements de base de données ou de journalisation SQL, il suffit d'exécuter
composer require -W webman/database.

Configuration de la base de données

config/database.php


return [
    // Base de données par défaut
    'default' => 'mysql',

    // Configurations pour diverses bases de donné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, // Nécessaire lors de l'utilisation de swoole ou swow comme pilote
            ],
            'pool' => [ // Configuration du pool de connexions
                'max_connections' => 5, // Nombre maximum de connexions
                'min_connections' => 1, // Nombre minimum de connexions
                'wait_timeout' => 3,    // Temps d'attente maximal pour obtenir une connexion depuis le pool, une exception sera levée après le délai. Effectif uniquement dans un environnement coopératif
                'idle_timeout' => 60,   // Temps d'inactivité maximal pour les connexions dans le pool, les connexions seront fermées après ce délai, jusqu'à ce que le nombre de connexions soit égal à min_connections
                'heartbeat_interval' => 50, // Temps d'intervalle pour le contrôle de l'état des connexions dans le pool, en secondes, recommandé d'être inférieur à 60 secondes
            ],
        ],
    ],
];

À l'exception de la configuration pool, les autres configurations sont identiques à celles de Laravel.

À propos du pool de connexions

  • Chaque processus a son propre pool de connexions, le pool de connexions n'est pas partagé entre les processus.
  • Lorsque les coroutines ne sont pas activées, les tâches s'exécutent en file d'attente dans le processus, il n'y a donc pas de concurrence, le pool de connexions n'aura qu'une seule connexion au maximum.
  • Une fois les coroutines activées, les tâches s'exécutent en concurrence dans le processus, le pool de connexions s'ajustera dynamiquement en fonction des besoins, sans dépasser max_connections et sans descendre en dessous de min_connections.
  • Étant donné que le nombre maximal de connexions dans le pool est max_connections, lorsque le nombre de coroutines effectuant des opérations sur la base de données dépasse max_connections, certaines coroutines seront en attente, avec un temps d'attente maximal de wait_timeout secondes, au-delà duquel une exception sera déclenchée.
  • En cas d'inactivité (y compris dans les environnements coopératifs et non coopératifs), les connexions seront récupérées après idle_timeout secondes, jusqu'à ce que le nombre de connexions soit égal à min_connections (min_connections peut être 0).

Exemple d'utilisation de la base de données

<?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");
    }
}

Nous voyons que l'utilisation est similaire à celle de Laravel, utilisant la méthode Db::table() pour manipuler la base de données.