Start · Sprachen · PHP · Referenz · Swoole\Coroutine\MySQL

Swoole\Coroutine\MySQL

Klasse

Stellt einen koroutinenfähigen MySQL-Client bereit, der innerhalb von Swoole-Koroutinen nicht-blockierend auf Datenbankverbindungen und -abfragen zugreift.

seit PHP 4.0.0 Kategorie: misc

Signatur

class Swoole\Coroutine\MySQL

Beschreibung

Swoole\Coroutine\MySQL ist ein asynchroner, koroutinenfähiger MySQL-Client für den Einsatz in Swoole-Applikationen. Er erlaubt es, MySQL-Datenbankabfragen innerhalb von Koroutinen auszuführen, ohne den gesamten Prozess zu blockieren. Während eine Abfrage auf eine Antwort des Datenbankservers wartet, gibt die Koroutine die Kontrolle an den Event-Loop zurück, sodass andere Koroutinen parallel arbeiten können.

Die API ähnelt der klassischen mysqli-Erweiterung, ist jedoch vollständig auf das Koroutinen-Modell von Swoole ausgerichtet. Typischerweise wird die Klasse innerhalb eines Swoole\Coroutine\run()-Blocks oder einer go()-Closure verwendet, um den koroutinen-spezifischen Kontext zu gewährleisten.

Wichtige Methoden umfassen: connect() zum Aufbau der Verbindung, query() für einfache SQL-Abfragen, prepare() und execute() für parametrisierte Statements sowie recv() für den Empfang von Ergebnissen bei defer-Modus. Der Client unterstützt außerdem Transaktionen über begin(), commit() und rollback().

Hinweis: Ab Swoole 4.6.0 wird empfohlen, stattdessen Swoole\Coroutine\PDO oder den PDO-Hook über Swoole\Runtime::enableCoroutine() zu verwenden, da Swoole\Coroutine\MySQL seitdem als veraltet gilt. Für neue Projekte ist der Runtime-Hook mit Standard-PDO die bevorzugte Lösung.

Parameter

Name Typ Default Beschreibung
$host Pflicht string Hostname oder IP-Adresse des MySQL-Servers (wird an connect() übergeben).
$port int 3306 TCP-Port des MySQL-Servers.
$user Pflicht string Benutzername für die Authentifizierung am MySQL-Server.
$password Pflicht string Passwort für den MySQL-Benutzer.
$database string Name der Standard-Datenbank, die nach dem Verbindungsaufbau ausgewählt wird.
$charset string utf8mb4 Zeichensatz der Verbindung, z. B. utf8mb4.
$timeout float -1 Timeout in Sekunden für Verbindungs- und Abfrageoperationen. -1 bedeutet kein Timeout.
$strict_type bool false Wenn true, werden Ganzzahlen und Gleitkommazahlen aus MySQL-Resultaten als native PHP-Typen zurückgegeben statt als Strings.
$fetch_mode bool false Aktiviert den Fetch-Modus, sodass Ergebnisse zeilenweise mit fetch() abgerufen werden können.

Rückgabewert

Typ

Beispiele

Einfache Datenbankabfrage innerhalb einer Koroutine

<?php
use Swoole\Coroutine\MySQL;
use function Swoole\Coroutine\run;

run(function () {
    $db = new MySQL();

    $connected = $db->connect([
        'host'        => '127.0.0.1',
        'port'        => 3306,
        'user'        => 'root',
        'password'    => 'geheim',
        'database'    => 'testdb',
        'charset'     => 'utf8mb4',
        'strict_type' => true,
    ]);

    if (!$connected) {
        echo "Verbindung fehlgeschlagen: " . $db->connect_error . PHP_EOL;
        return;
    }

    $result = $db->query('SELECT id, name FROM users LIMIT 5');

    if ($result === false) {
        echo "Fehler: " . $db->error . PHP_EOL;
        return;
    }

    foreach ($result as $row) {
        echo "ID: {$row['id']}, Name: {$row['name']}" . PHP_EOL;
    }
});
ID: 1, Name: Alice ID: 2, Name: Bob ID: 3, Name: Charlie

Parametrisierte Abfrage mit prepare() und execute()

<?php
use Swoole\Coroutine\MySQL;
use function Swoole\Coroutine\run;

run(function () {
    $db = new MySQL();
    $db->connect([
        'host'        => '127.0.0.1',
        'user'        => 'root',
        'password'    => 'geheim',
        'database'    => 'testdb',
        'strict_type' => true,
    ]);

    // Prepared Statement erstellen
    $stmt = $db->prepare('SELECT id, email FROM users WHERE id = ? AND active = ?');

    if ($stmt === false) {
        echo "Prepare-Fehler: " . $db->error . PHP_EOL;
        return;
    }

    // Statement ausführen
    $result = $stmt->execute([42, 1]);

    if ($result === false) {
        echo "Execute-Fehler: " . $stmt->error . PHP_EOL;
        return;
    }

    if (empty($result)) {
        echo "Kein Benutzer gefunden." . PHP_EOL;
    } else {
        $user = $result[0];
        echo "Benutzer {$user['id']}: {$user['email']}" . PHP_EOL;
    }
});
Benutzer 42: alice@example.com

Transaktion mit begin(), commit() und rollback()

<?php
use Swoole\Coroutine\MySQL;
use function Swoole\Coroutine\run;

run(function () {
    $db = new MySQL();
    $db->connect([
        'host'     => '127.0.0.1',
        'user'     => 'root',
        'password' => 'geheim',
        'database' => 'testdb',
    ]);

    $db->begin();

    $ok1 = $db->query("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    $ok2 = $db->query("UPDATE accounts SET balance = balance + 100 WHERE id = 2");

    if ($ok1 && $ok2) {
        $db->commit();
        echo "Transaktion erfolgreich." . PHP_EOL;
    } else {
        $db->rollback();
        echo "Transaktion zurückgerollt: " . $db->error . PHP_EOL;
    }
});
Transaktion erfolgreich.

// Wichtig · Fallstricke

Deprecation: Swoole\Coroutine\MySQL gilt ab Swoole 4.6.0 als veraltet. Für neue Projekte sollte stattdessen der Coroutine-Runtime-Hook (Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_PDO_MYSQL)) in Kombination mit der Standard-PHP-PDO-Klasse verwendet werden.

Sicherheit: Benutzerinput niemals direkt in query()-Aufrufen konkatenieren. Stets prepare() und execute() mit Platzhaltern verwenden, um SQL-Injection-Angriffe zu verhindern.

Koroutinen-Kontext: Die Klasse darf ausschließlich innerhalb eines aktiven Koroutinen-Kontexts (go() oder Swoole\Coroutine\run()) verwendet werden. Ein Aufruf außerhalb führt zu Fehlern oder blockierendem Verhalten.

Connection-Pooling: Für Produktionsumgebungen mit vielen gleichzeitigen Anfragen empfiehlt sich der Einsatz von Swoole\Database\PDOPool oder Swoole\ConnectionPool, um Datenbankverbindungen effizient zu verwalten und wiederzuverwenden.