Schnelleinführung in die Datenbank (basierend auf dem Laravel-Datenbankkomponenten)

webman/database ist auf der Basis von illuminate/database entwickelt und bietet eine Verbindungspoolfunktion, die sowohl in korutinen als auch in nicht-korutinen Umgebungen unterstützt wird. Die Nutzung erfolgt auf die gleiche Weise wie bei Laravel.

Entwickler können auch das Kapitel Verwendung anderer Datenbankkomponenten konsultieren, um ThinkPHP oder andere Datenbanken zu verwenden.

Hinweis
Dieses Handbuch gilt für die Version webman-v2. Falls Sie die Version webman-v1 verwenden, schauen Sie bitte in das v1 Handbuch.

Datenbankinstallation

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

Nach der Installation ist ein Neustart erforderlich (reload hat keine Wirkung).

Hinweis
webman/database ist von Laravel's illuminate/database abhängig, daher werden beim Installieren automatisch die Abhängigkeiten von illuminate/database installiert.

Hinweis
Wenn Sie keine Paginierung, Datenbankereignisse oder SQL-Protokollierung benötigen, führen Sie einfach
composer require -W webman/database aus.

Datenbankkonfiguration

config/database.php


return [
    // Standarddatenbank
    'default' => 'mysql',

    // Verschiedene Datenbankkonfigurationen
    '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, // Dies ist notwendig, wenn swoole oder swow als Treiber verwendet wird
            ],
            'pool' => [ // Verbindungspoolkonfiguration
                'max_connections' => 5, // Maximalverbindungen
                'min_connections' => 1, // Minimalverbindungen
                'wait_timeout' => 3,    // Maximale Wartezeit beim Abrufen einer Verbindung aus dem Pool. Bei Überschreitung wird eine Ausnahme ausgelöst. Gilt nur in Korutinenumgebungen
                'idle_timeout' => 60,   // Maximale Leerlaufzeit für Verbindungen im Verbindungspool. Nach Überschreitung wird die Verbindung geschlossen und zurückgewonnen, bis die Anzahl der Verbindungen `min_connections` erreicht
                'heartbeat_interval' => 50, // Zeitintervall für die Herzschlagprüfung des Verbindungspools, in Sekunden, empfohlen weniger als 60 Sekunden
            ],
        ],
    ],
];

Abgesehen von der pool-Konfiguration sind die anderen Konfigurationen identisch mit Laravel.

Über den Verbindungspool

  • Jeder Prozess hat seinen eigenen Verbindungspool, der zwischen Prozessen nicht geteilt wird.
  • Bei deaktivierten Korutinen wird die Verarbeitung im Prozess nacheinander ausgeführt, es entsteht keine Parallelität, sodass der Verbindungspool maximal nur eine Verbindung hat.
  • Bei aktivierten Korutinen wird die Verarbeitung im Prozess parallel durchgeführt, und die Anzahl der Verbindungen im Pool wird je nach Bedarf dynamisch angepasst, wobei sie maximal max_connections und minimal min_connections nicht unterschreiten kann.
  • Da die maximale Anzahl der Verbindungen im Pool max_connections beträgt, wird bei einer Anzahl von Korutinen, die die Datenbank betreiben, die größer ist als max_connections, eine oder mehrere Korutinen in der Warteschlange bleiben, maximal wait_timeout Sekunden warten und bei Überschreitung eine Ausnahme auslösen.
  • Im Leerlauf (einschließlich Korutinen- und Nicht-Korutinenumgebungen) werden Verbindungen nach idle_timeout Zeit zurückgewonnen, bis die Anzahl der Verbindungen min_connections erreicht (min_connections kann 0 sein).

Beispiel für die Nutzung der Datenbank

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

Wir sehen, dass die Nutzung identisch mit Laravel ist, wobei die Methode Db::table() verwendet wird, um mit der Datenbank zu interagieren.