Signatur
Beschreibung
PgSql\Lob ist eine vollständig opake Klasse, die in PHP 8.1.0 eingeführt wurde, um den zuvor verwendeten resource-Typ für PostgreSQL-Large-Objects (LOBs) abzulösen. Large Objects in PostgreSQL ermöglichen das Speichern und Abrufen großer Binärdaten (z. B. Dateien, Bilder) direkt in der Datenbank über spezielle OID-basierte Mechanismen.
Instanzen dieser Klasse werden nicht direkt per new erzeugt, sondern ausschließlich durch PostgreSQL-Funktionen wie pg_lo_open() zurückgegeben. Da die Klasse vollständig opak ist, besitzt sie keine öffentlich zugänglichen Eigenschaften oder Methoden – sie dient lediglich als typsicherer Handle, der an weitere LOB-Funktionen wie pg_lo_read(), pg_lo_write() oder pg_lo_close() übergeben wird.
Die Migration von der alten Ressource auf PgSql\Lob-Objekte erfolgt in der Regel transparent, da bestehende pgsql-LOB-Funktionen weiterhin funktionieren. Lediglich Code, der explizit auf den Typ resource prüft (z. B. mit is_resource()), muss angepasst werden.
Die Verwendung von Large Objects sollte stets innerhalb einer Transaktion erfolgen, da PostgreSQL LOB-Operationen ohne aktive Transaktion nicht zuverlässig unterstützt.
Beispiele
Large Object öffnen, lesen und schließen
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
// Transaktion starten (erforderlich für LOB-Operationen)
pg_query($conn, 'BEGIN');
// Angenommen, OID 12345 ist ein gespeichertes Large Object
$oid = 12345;
$lob = pg_lo_open($conn, $oid, 'r');
if ($lob instanceof PgSql\Lob) {
echo 'LOB erfolgreich geöffnet.' . PHP_EOL;
$data = pg_lo_read($lob, 4096);
echo 'Gelesene Bytes: ' . strlen($data) . PHP_EOL;
pg_lo_close($lob);
} else {
echo 'Fehler beim Öffnen des LOB.' . PHP_EOL;
}
pg_query($conn, 'COMMIT');
pg_close($conn);
Neues Large Object erstellen und Daten schreiben
<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=secret');
pg_query($conn, 'BEGIN');
// Neues Large Object erzeugen (gibt OID zurück)
$oid = pg_lo_create($conn);
echo 'Neue LOB-OID: ' . $oid . PHP_EOL;
// LOB zum Schreiben öffnen
$lob = pg_lo_open($conn, $oid, 'w');
if ($lob instanceof PgSql\Lob) {
$bytesWritten = pg_lo_write($lob, 'Hallo, Large Object!');
echo 'Geschriebene Bytes: ' . $bytesWritten . PHP_EOL;
pg_lo_close($lob);
}
pg_query($conn, 'COMMIT');
pg_close($conn);
// Wichtig · Fallstricke
Transaktionspflicht: PostgreSQL erfordert, dass alle Large-Object-Operationen innerhalb einer aktiven Transaktion stattfinden. Ohne BEGIN können Funktionen wie pg_lo_open() fehlschlagen oder unerwartetes Verhalten zeigen.
Typ-Prüfung: Da PgSql\Lob keine resource mehr ist, schlägt ein is_resource($lob)-Check fehl. Verwende stattdessen $lob instanceof PgSql\Lob oder is_object($lob).
Opake Klasse: Die Klasse besitzt keinerlei öffentliche Eigenschaften oder Methoden – sie ist ausschließlich als Übergabe-Handle für die pgsql-LOB-Funktionen gedacht und darf nicht serialisiert oder geklont werden.