Signatur
Beschreibung
dba_open() öffnet eine dateibasierte Datenbank über Phis DBA-Erweiterung (Database Abstraction Layer). DBA ermöglicht es, einfache Schlüssel-Wert-Datenbanken verschiedener Formate (z. B. GDBM, NDBM, DB4, CDB, LMDB) über eine einheitliche API zu nutzen, ohne datenbankspezifischen Code zu schreiben.
Der Parameter mode steuert den Öffnungsmodus: r öffnet die Datenbank nur lesend, w lesend und schreibend, c erzeugt die Datenbank falls nicht vorhanden (lesend/schreibend), und n erzeugt immer eine neue (leere) Datenbank. Wird dem Modus ein l angehängt (z. B. cl), wird ein einfaches Datei-Locking verwendet; ein d aktiviert internes Datenbank-Locking.
Das zurückgegebene Handle wird an alle weiteren dba_*-Funktionen übergeben. Nach der Arbeit mit der Datenbank sollte das Handle mit dba_close() geschlossen werden, um Ressourcen und Locks freizugeben. dba_open() eignet sich besonders für einfache Konfigurationsspeicher, Caches oder kleine persistente Schlüssel-Wert-Stores ohne vollständiges RDBMS.
Im Unterschied zu dba_popen() wird bei dba_open() keine persistente Verbindung verwendet, d. h. bei jedem Skriptaufruf wird die Datenbank neu geöffnet und beim Ende der Anfrage (oder durch dba_close()) wieder geschlossen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Dateisystempfad zur Datenbankdatei. Der PHP-Prozess muss Lese- und ggf. Schreibrechte auf diesen Pfad besitzen. | |
| $mode Pflicht | string | Öffnungsmodus: r (nur lesen), w (lesen/schreiben), c (lesen/schreiben, erzeugen falls nötig), n (neu anlegen). Optional mit Locking-Suffix: l (Datei-Lock) oder d (Datenbank-internes Locking). Beispiel: cl. |
|
| $handler | string | Name des zu verwendenden DBA-Handlers, z. B. gdbm, db4, cdb, lmdb oder flatfile. Wenn leer, wird der erste verfügbare Handler verwendet. |
|
| $handler_params | mixed | Optionale zusätzliche Parameter, die direkt an den gewählten Handler weitergereicht werden. Inhalt und Anzahl sind handler-spezifisch. |
Rückgabewert
resource) zurück, das für alle weiteren dba_*-Funktionen benötigt wird. Im Fehlerfall (z. B. fehlende Rechte, nicht unterstützter Handler, Lock-Konflikt) wird false zurückgegeben und ein Fehler ausgegeben.Beispiele
Einfaches Lesen und Schreiben einer DBA-Datenbank
<?php
// Datenbank öffnen oder anlegen (Modus 'c' = create if not exists)
$db = dba_open('/tmp/meine_datenbank.db', 'c', 'gdbm');
if ($db === false) {
die('Datenbank konnte nicht geöffnet werden.');
}
// Schlüssel-Wert-Paar speichern
dba_replace('benutzername', 'Max Mustermann', $db);
dba_replace('email', 'max@example.com', $db);
// Wert auslesen
$name = dba_fetch('benutzername', $db);
echo 'Name: ' . $name . PHP_EOL;
// Datenbank schließen
dba_close($db);
Alle Einträge einer bestehenden Datenbank iterieren
<?php
// Datenbank nur lesend öffnen
$db = dba_open('/tmp/meine_datenbank.db', 'r', 'gdbm');
if ($db === false) {
die('Datenbank konnte nicht geöffnet werden.');
}
// Über alle Schlüssel iterieren
$key = dba_firstkey($db);
while ($key !== false) {
$value = dba_fetch($key, $db);
echo htmlspecialchars($key) . ': ' . htmlspecialchars($value) . PHP_EOL;
$key = dba_nextkey($db);
}
dba_close($db);
// Wichtig · Fallstricke
Locking-Hinweis: Bei konkurrierenden Zugriffen aus mehreren Prozessen (z. B. Webserver-Anfragen) sollte ein Locking-Modus (l oder d) verwendet werden, um Datenverlust durch gleichzeitige Schreibzugriffe zu vermeiden. Nicht alle Handler unterstützen beide Locking-Varianten.
Handler-Verfügbarkeit: Welche Handler verfügbar sind, hängt von der PHP-Kompilierung ab. Mit dba_handlers() lassen sich alle installierten Handler auflisten.
Dateiberechtigungen: Der Webserver-Prozess benötigt Schreibrechte auf das Verzeichnis und die Datenbankdatei (bei w/c/n). Datenbankdateien sollten außerhalb des Webroot gespeichert werden, um direkten HTTP-Zugriff zu verhindern.
Persistente Verbindungen: Für persistente Verbindungen (z. B. bei Nutzung über mehrere Anfragen hinweg) steht dba_popen() zur Verfügung, das intern Verbindungs-Pooling nutzt.