Start · Sprachen · PHP · Referenz · PgSql\Lob

PgSql\Lob

Klasse

Repräsentiert ein PostgreSQL-Large-Object und ersetzt ab PHP 8.1.0 den bisherigen Ressource-Typ für pgsql-Large-Objects.

seit PHP 8.1.0 Kategorie: db

Signatur

class PgSql\Lob

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);
LOB erfolgreich geöffnet. Gelesene Bytes: 4096

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);
Neue LOB-OID: 16432 Geschriebene Bytes: 20

// 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.