Start · Sprachen · PHP · Referenz · pg_lo_close

pg_lo_close

Funktion

Schließt ein zuvor geöffnetes PostgreSQL Large Object und gibt die zugehörigen Ressourcen frei.

seit PHP 4.2.0 Kategorie: db

Signatur

pg_lo_close(PgSql\Lob $lob): bool

Beschreibung

pg_lo_close() schließt ein PostgreSQL Large Object, das mit pg_lo_open() geöffnet wurde. Nach dem Aufruf ist das Large-Object-Handle ungültig und darf nicht mehr verwendet werden. Die Funktion gibt true zurück, wenn das Schließen erfolgreich war, andernfalls false.

Large Objects in PostgreSQL ermöglichen die Speicherung großer Binärdaten (z. B. Bilder, Dokumente) in der Datenbank. Sie werden über spezielle OID-Referenzen verwaltet und müssen innerhalb einer Transaktion geöffnet, bearbeitet und geschlossen werden. Das Schließen mit pg_lo_close() beendet den Zugriff auf das Objekt, löscht es jedoch nicht — dafür ist pg_lo_unlink() zuständig.

Es ist wichtig, geöffnete Large Objects stets zu schließen, bevor die Transaktion committed oder zurückgerollt wird. Nicht geschlossene Handles können zu Ressourcenlecks führen. In modernem PHP (ab 8.1) wird das PgSql\Lob-Objekt anstelle der älteren resource-Referenz verwendet.

Parameter

Name Typ Default Beschreibung
$lob Pflicht PgSql\Lob Das Large-Object-Handle, das mit pg_lo_open() geöffnet wurde. Ab PHP 8.1 ist dies eine Instanz von PgSql\Lob; in älteren PHP-Versionen eine resource.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Large Object erfolgreich geschlossen wurde, andernfalls false.

Beispiele

Large Object öffnen, lesen und schließen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

// Transaktion starten (erforderlich für Large Objects)
pg_query($conn, 'BEGIN');

$oid = 12345; // OID eines vorhandenen Large Objects
$lob = pg_lo_open($conn, $oid, 'r');

if ($lob === false) {
    pg_query($conn, 'ROLLBACK');
    die('Large Object konnte nicht geöffnet werden');
}

$inhalt = pg_lo_read($lob, 4096);
echo 'Gelesene Bytes: ' . strlen($inhalt) . PHP_EOL;

// Large Object schließen
if (pg_lo_close($lob)) {
    echo 'Large Object erfolgreich geschlossen.' . PHP_EOL;
} else {
    echo 'Fehler beim Schließen des Large Objects.' . PHP_EOL;
}

pg_query($conn, 'COMMIT');
pg_close($conn);
Gelesene Bytes: 4096 Large Object erfolgreich geschlossen.

Large Object erstellen, beschreiben und schließen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

pg_query($conn, 'BEGIN');

// Neues Large Object anlegen
$oid = pg_lo_create($conn);
echo 'Neues Large Object mit OID: ' . $oid . PHP_EOL;

$lob = pg_lo_open($conn, $oid, 'w');
if ($lob === false) {
    pg_query($conn, 'ROLLBACK');
    die('Öffnen fehlgeschlagen');
}

$daten = 'Beispiel-Binärdaten für das Large Object';
$geschrieben = pg_lo_write($lob, $daten);
echo 'Geschriebene Bytes: ' . $geschrieben . PHP_EOL;

// Schließen vor dem Commit
pg_lo_close($lob);
echo 'Large Object geschlossen.' . PHP_EOL;

pg_query($conn, 'COMMIT');
pg_close($conn);
Neues Large Object mit OID: 16420 Geschriebene Bytes: 42 Large Object geschlossen.

// Wichtig · Fallstricke

Transaktion erforderlich: PostgreSQL Large Objects müssen innerhalb einer aktiven Transaktion bearbeitet werden. Ohne vorheriges BEGIN schlägt das Öffnen fehl oder das Verhalten ist undefiniert.

Reihenfolge beachten: pg_lo_close() sollte stets vor pg_query($conn, 'COMMIT') oder pg_query($conn, 'ROLLBACK') aufgerufen werden, um sicherzustellen, dass alle Puffer geleert sind.

Nicht mit pg_lo_unlink() verwechseln: pg_lo_close() schließt nur den Zugriffshandle — das Large Object bleibt in der Datenbank erhalten. Zum endgültigen Löschen muss pg_lo_unlink() verwendet werden.