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 deilluminate/database
de Laravel, donc lors de l'installation, les paquets dépendants deilluminate/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 demin_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épassemax_connections
, certaines coroutines seront en attente, avec un temps d'attente maximal dewait_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.