Signatur
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
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;
}
});
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;
}
});
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;
}
});
// 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.