Start · Sprachen · PHP · Referenz · ocifreedesc

ocifreedesc

Funktion

Veralteter Alias von <code>OCILob::free()</code> — gibt die Ressourcen eines OCI-LOB-Deskriptors frei.

seit PHP 5.0.0 Kategorie: db

Signatur

ocifreedesc(OCILob $lob): bool

Beschreibung

ocifreedesc() ist ein veralteter prozeduraler Alias für die Methode OCILob::free(). Sie gibt den Speicher und die internen Ressourcen frei, die einem OCI-LOB-Deskriptorobjekt zugeordnet sind, das zuvor über Oracle-Datenbankoperationen erzeugt wurde.

LOB-Deskriptoren (Large Objects, z. B. CLOB, BLOB oder BFILE) belegen sowohl auf der PHP-Seite als auch auf der Oracle-Serverseite Ressourcen. Werden diese nicht explizit freigegeben, kann es zu Ressourcenlecks kommen, insbesondere in Skripten, die viele LOBs verarbeiten. Der Aufruf dieser Funktion stellt sicher, dass Ressourcen sofort und nicht erst beim Garbage Collector freigegeben werden.

Da ocifreedesc() ein Alias der veralteten OCI-Funktionsfamilie (ohne Präfix oci_) ist, sollte in modernem Code stattdessen OCILob::free() bzw. der OCI8-Stil oci_free_descriptor() verwendet werden. Die Funktion ist seit PHP 8.0 als deprecated eingestuft.

  • Verwende OCILob::free() oder oci_free_descriptor() in neuem Code.
  • Rufe die Methode auf, sobald du mit dem LOB-Objekt fertig bist, um Ressourcen zeitnah freizugeben.

Parameter

Name Typ Default Beschreibung
$lob Pflicht OCILob Ein OCILob-Objekt (LOB-Deskriptor), das mit einer OCI-Datenbankoperation erzeugt wurde und nun freigegeben werden soll.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn der Deskriptor bereits freigegeben wurde oder ungültig ist).

Beispiele

LOB-Deskriptor nach dem Lesen freigeben

<?php
// Verbindung herstellen
$conn = oci_connect('benutzername', 'passwort', 'localhost/XE');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

// Statement mit LOB-Spalte vorbereiten
$stid = oci_parse($conn, 'SELECT inhalt FROM dokumente WHERE id = :id');
oci_bind_by_name($stid, ':id', $id);
$id = 42;
oci_execute($stid);

$row = oci_fetch_array($stid, OCI_ASSOC + OCI_RETURN_LOBS);
$lobDeskriptor = $row['INHALT'];

// LOB-Inhalt lesen
$inhalt = $lobDeskriptor->load();
echo $inhalt;

// Veralteter Alias: Deskriptor freigeben
ocifreedesc($lobDeskriptor);

oci_free_statement($stid);
oci_close($conn);
?>

Moderner Ersatz: OCILob::free() verwenden

<?php
// Empfohlene moderne Alternative zu ocifreedesc()
$conn = oci_connect('benutzername', 'passwort', 'localhost/XE');

$stid = oci_parse($conn, 'SELECT bild FROM produkte WHERE id = :id');
oci_bind_by_name($stid, ':id', $id);
$id = 7;
oci_execute($stid);

$row = oci_fetch_array($stid, OCI_ASSOC);
/** @var OCILob $lob */
$lob = $row['BILD'];

if ($lob !== null) {
    $bilddaten = $lob->load();
    // Bild verarbeiten ...

    // Empfohlene Methode: free() direkt aufrufen
    $lob->free();
}

oci_free_statement($stid);
oci_close($conn);
?>

// Wichtig · Fallstricke

Deprecated: ocifreedesc() ist ein Alias aus der alten oci*()-Funktionsfamilie ohne Unterstrich und wurde in PHP 8.0 als veraltet (deprecated) markiert. In PHP 8.x erzeugt der Aufruf eine E_DEPRECATED-Warnung. Verwende stattdessen OCILob::free() oder oci_free_descriptor().

Ein häufiger Fehler ist es, LOB-Deskriptoren nicht freizugeben, wenn viele Datenbankzeilen iteriert werden. Dies kann zu Speicherproblemen und erschöpften Oracle-Cursor-Ressourcen führen. Stelle sicher, dass free() in allen Codepfaden aufgerufen wird — auch im Fehlerfall (z. B. mit try/finally).