Start · Sprachen · PHP · Referenz · dba_open

dba_open

Funktion

Öffnet eine DBA-Datenbank (Database Abstraction Layer) am angegebenen Pfad und gibt ein Verbindungs-Handle zurück.

seit PHP 4.0.0 Kategorie: db

Signatur

dba_open(string $path, string $mode, string $handler = '', mixed ...$handler_params): resource|false

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

Typ
resource|false
Beschreibung
Gibt bei Erfolg ein DBA-Datenbankhandle (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);
Name: Max Mustermann

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);
benutzername: Max Mustermann email: max@example.com

// 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.