Signatur
Beschreibung
dba_optimize() ruft eine datenbankspezifische Optimierungsroutine für eine zuvor mit dba_open() oder dba_popen() geöffnete DBA-Datenbank auf. Die genaue Wirkung hängt vom verwendeten Datenbank-Handler ab (z. B. gdbm, db4, lmdb). Typischerweise werden gelöschte Datensätze physisch entfernt und die Datei komprimiert, sodass sie weniger Speicherplatz belegt.
Nach häufigen Schreib- und Löschoperationen kann eine DBA-Datenbankdatei intern fragmentiert sein. Die Optimierung sollte daher regelmäßig nach intensiven Schreibvorgängen aufgerufen werden, um Dateigröße und Zugriffsgeschwindigkeit zu verbessern.
Nicht alle Handler unterstützen diese Funktion vollständig. Bei Handlern, die keine Optimierung implementieren, gibt die Funktion möglicherweise sofort true zurück, ohne echte Änderungen vorzunehmen. Es empfiehlt sich, die Rückgabe zu prüfen und die Datenbank vor der Optimierung zu sichern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $database Pflicht | Dba\Connection|resource | Eine gültige DBA-Datenbankverbindung, die zuvor mit dba_open() oder dba_popen() geöffnet wurde. Ab PHP 8.4 ist dies eine Instanz von Dba\Connection, in älteren Versionen ein resource. |
Rückgabewert
true zurück, wenn die Optimierung erfolgreich war oder der Handler keine Optimierung benötigt. Gibt false zurück, wenn die Optimierung fehlgeschlagen ist.Beispiele
Datenbank nach Massenlöschungen optimieren
<?php
// Datenbank im Schreib-Lese-Modus öffnen
$db = dba_open('/tmp/meine_daten.db', 'w', 'gdbm');
if ($db === false) {
die('Datenbank konnte nicht geöffnet werden.');
}
// Beispiel: mehrere Einträge löschen
foreach (['key1', 'key2', 'key3'] as $key) {
dba_delete($key, $db);
}
// Datenbank optimieren
if (dba_optimize($db)) {
echo 'Datenbank erfolgreich optimiert.' . PHP_EOL;
} else {
echo 'Optimierung fehlgeschlagen.' . PHP_EOL;
}
dba_close($db);
Optimierung kombiniert mit Synchronisation
<?php
$db = dba_open('/tmp/produkte.db', 'w', 'db4');
if ($db === false) {
die('Fehler beim Öffnen der Datenbank.');
}
// Einträge einfügen und löschen
dba_insert('produkt_1', 'Apfel', $db);
dba_insert('produkt_2', 'Banane', $db);
dba_delete('produkt_1', $db);
// Ausstehende Schreibvorgänge synchronisieren
dba_sync($db);
// Anschließend optimieren
$result = dba_optimize($db);
echo $result ? 'Optimierung abgeschlossen.' : 'Optimierung nicht möglich.';
dba_close($db);
// Wichtig · Fallstricke
Handler-Abhängigkeit: Die tatsächliche Wirkung von dba_optimize() ist stark vom verwendeten DBA-Handler abhängig. Handler wie flatfile oder inifile unterstützen möglicherweise keine echte Optimierung und geben immer true zurück.
Backup empfohlen: Da die Optimierung die Datenbankdatei physisch verändern kann, sollte vor dem Aufruf eine Sicherungskopie der Datenbankdatei angelegt werden, um Datenverlust bei unerwarteten Fehlern zu vermeiden.
Exklusiver Zugriff: Während der Optimierung sollte kein anderer Prozess gleichzeitig schreibend auf die Datenbank zugreifen. Gegebenenfalls sollte ein Sperrmechanismus (z. B. über dba_open() im Locking-Modus) eingesetzt werden.