Start · Sprachen · PHP · Referenz · dba_sync

dba_sync

Funktion

Synchronisiert eine mit <code>dba_open()</code> oder <code>dba_popen()</code> geöffnete DBA-Datenbank, indem ausstehende Schreiboperationen auf den Datenträger übertragen werden.

seit PHP 4.0.0 Kategorie: db

Signatur

dba_sync(Dba\Connection $dba): bool

Beschreibung

dba_sync() veranlasst die DBA-Bibliothek, alle im Puffer gehaltenen Schreiboperationen in die zugrunde liegende Datenbankdatei zu schreiben. Dies ist besonders wichtig, wenn mehrere Prozesse gleichzeitig auf eine Datenbank zugreifen oder wenn sichergestellt werden soll, dass Daten nach einer Reihe von Schreibvorgängen dauerhaft persistiert sind.

Die Funktion arbeitet mit dem Handler-Ressource-Objekt, das von dba_open() oder dba_popen() zurückgegeben wurde. Nicht alle DBA-Handler unterstützen diese Operation gleichermaßen — bei einigen Backends ist dba_sync() ein No-Op, der stets true zurückgibt.

Typische Einsatzszenarien sind das explizite Sichern von Daten nach einem Batch-Import oder nach kritischen Schreibvorgängen, um Datenverlust bei einem unerwarteten Programmabbruch zu vermeiden. In vielen Fällen wird dba_sync() kurz vor dba_close() aufgerufen.

Ab PHP 8.4 wird der Parameter als typisiertes Dba\Connection-Objekt erwartet; in älteren PHP-Versionen handelt es sich um eine resource.

Parameter

Name Typ Default Beschreibung
$dba Pflicht Dba\Connection Das Verbindungs-Handle der Datenbank, das von dba_open() oder dba_popen() zurückgegeben wurde.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Synchronisierung erfolgreich war, andernfalls false.

Beispiele

Datenbank nach Schreibvorgängen synchronisieren

<?php
$db = dba_open('/tmp/beispiel.db', 'c', 'gdbm');

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

// Mehrere Datensätze einfügen
dba_insert('schluessel1', 'wert1', $db);
dba_insert('schluessel2', 'wert2', $db);
dba_insert('schluessel3', 'wert3', $db);

// Ausstehende Schreibvorgänge auf den Datenträger synchronisieren
if (dba_sync($db)) {
    echo 'Datenbank erfolgreich synchronisiert.' . PHP_EOL;
} else {
    echo 'Fehler beim Synchronisieren der Datenbank.' . PHP_EOL;
}

dba_close($db);
Datenbank erfolgreich synchronisiert.

Synchronisierung in einem Batch-Import-Szenario

<?php
$db = dba_open('/tmp/produkte.db', 'c', 'db4');

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

$produkte = [
    'prod_001' => 'Apfel',
    'prod_002' => 'Birne',
    'prod_003' => 'Kirsche',
];

foreach ($produkte as $id => $name) {
    dba_replace($id, $name, $db);
}

// Nach dem Batch-Import explizit synchronisieren
if (!dba_sync($db)) {
    error_log('Warnung: DBA-Synchronisierung fehlgeschlagen!');
}

echo 'Import abgeschlossen. ' . count($produkte) . ' Produkte gespeichert.' . PHP_EOL;

dba_close($db);
Import abgeschlossen. 3 Produkte gespeichert.

// Wichtig · Fallstricke

Handler-Kompatibilität: Nicht alle DBA-Handler implementieren dba_sync() sinnvoll. Bei Handlern wie flatfile oder cdb kann die Funktion lediglich true zurückgeben, ohne tatsächlich etwas zu schreiben. Prüfen Sie die Dokumentation des verwendeten Handlers.

Parallelzugriffe: Wenn mehrere Prozesse gleichzeitig auf dieselbe DBA-Datei zugreifen, sollte dba_sync() zusammen mit einem geeigneten Sperrmechanismus (z. B. dba_open() mit dem Modus 'l' für Schreibsperre) verwendet werden, um Dateninkonsistenz zu vermeiden.

PHP 8.4: Ab PHP 8.4 wurde die interne Ressource durch das Objekt Dba\Connection ersetzt. Code, der eine resource erwartet, muss entsprechend angepasst werden.