Start · Sprachen · PHP · Referenz · dba_popen

dba_popen

Funktion

Öffnet eine persistente Datenbankverbindung zu einer DBA-Datenbank und gibt eine Ressource zurück.

seit PHP 4.0.0 Kategorie: db

Signatur

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

Beschreibung

dba_popen() öffnet eine persistente Verbindung zu einer DBA-Datenbank (Database Abstraction Layer). Im Gegensatz zu dba_open() bleibt die Verbindung nach dem Ende des Skripts im Prozess-Cache erhalten und wird bei erneuten Aufrufen mit denselben Parametern wiederverwendet, was den Verbindungsaufwand reduziert.

Die Funktion unterstützt verschiedene Handler wie dbm, ndbm, gdbm, db2, db3, db4, cdb, flatfile und weitere, sofern die entsprechenden Bibliotheken bei der PHP-Kompilierung eingebunden wurden. Welche Handler verfügbar sind, lässt sich mit dba_handlers() abfragen.

Der Modus-Parameter steuert, ob die Datenbank lesend (r), lesend-schreibend (w), neu erstellend (c) oder ausschließlich neu erstellend (n) geöffnet wird. Ein angehängtes l aktiviert Datei-Locking, ein d erlaubt das Überspringen des Lockings. Persistente Verbindungen sind besonders in Umgebungen sinnvoll, in denen viele kurze Skript-Aufrufe auf dieselbe Datenbank zugreifen.

Da persistente Verbindungen im Prozess-Cache verbleiben, sollte darauf geachtet werden, dass Locks korrekt verwaltet werden. Eine unvorsichtige Verwendung kann zu Deadlocks führen, da der Lock-Status zwischen Anfragen erhalten bleibt.

Parameter

Name Typ Default Beschreibung
$path Pflicht string Dateipfad zur DBA-Datenbankdatei, die geöffnet werden soll. Der Pfad muss für den Webserver-Prozess zugänglich sein.
$mode Pflicht string Öffnungsmodus der Datenbank: r (nur lesen), w (lesen und schreiben), c (lesen/schreiben, Datei erzeugen falls nicht vorhanden), n (neu erstellen, bestehende Datei wird überschrieben). Optional kann l für Locking oder d zum Deaktivieren von Locking angehängt werden.
$handler string Name des zu verwendenden DBA-Handlers, z. B. gdbm, db4 oder flatfile. Wird kein Handler angegeben, wird der erste verfügbare Handler verwendet.
$handler_params mixed Optionale zusätzliche Parameter, die an den Handler weitergegeben werden. Abhängig vom verwendeten Handler.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt eine Datenbankressource zurück, die bei nachfolgenden DBA-Funktionen verwendet werden kann. Im Fehlerfall (z. B. Datei nicht vorhanden, fehlende Rechte, unbekannter Handler) wird false zurückgegeben.

Beispiele

Persistente DBA-Verbindung öffnen und Wert lesen

<?php
// Persistente Verbindung zur DBA-Datenbank öffnen
$db = dba_popen('/var/data/meine_datenbank', 'c', 'gdbm');

if ($db === false) {
    die('Datenbank konnte nicht geöffnet werden.');
}

// Wert schreiben
dba_insert('mein_schluessel', 'Hallo Welt', $db);

// Wert lesen
$wert = dba_fetch('mein_schluessel', $db);
echo $wert; // Gibt "Hallo Welt" aus

// Verbindung schließen (optional bei persistenten Verbindungen)
dba_close($db);
Hallo Welt

Alle Schlüssel einer persistenten DBA-Datenbank iterieren

<?php
$db = dba_popen('/var/data/konfiguration', 'r', 'flatfile');

if ($db === false) {
    die('Datenbank nicht gefunden oder nicht lesbar.');
}

// Alle gespeicherten Schlüssel-Wert-Paare ausgeben
$schluessel = dba_firstkey($db);
while ($schluessel !== false) {
    $wert = dba_fetch($schluessel, $db);
    echo htmlspecialchars($schluessel) . ' => ' . htmlspecialchars($wert) . PHP_EOL;
    $schluessel = dba_nextkey($db);
}

dba_close($db);

// Wichtig · Fallstricke

Persistenz und Locking: Da persistente Verbindungen über mehrere Anfragen hinweg im Prozess-Cache verbleiben, können Locks, die im vorherigen Request gesetzt wurden, noch aktiv sein. Dies kann zu Deadlocks führen. In einer Umgebung mit mehreren gleichzeitigen Prozessen sollte das Locking-Verhalten sorgfältig geplant werden.

Unterschied zu dba_open(): dba_popen() versucht, eine bereits geöffnete Verbindung mit identischem Pfad, Modus und Handler wiederzuverwenden. Dennoch wird dba_close() auf einer persistenten Verbindung die Ressource nicht wirklich schließen, sondern sie lediglich aus dem aktuellen Skript-Kontext entfernen.

Handler-Verfügbarkeit: Nicht alle Handler sind in jeder PHP-Installation verfügbar. Prüfe mit dba_handlers(), welche Handler auf dem System unterstützt werden.