Signatur
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()oderoci_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
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).