Signatur
Beschreibung
oci_free_descriptor() gibt den Speicher eines Oracle-LOB- oder FILE-Deskriptors frei. Deskriptoren werden verwendet, um große Objekte (CLOB, BLOB, NCLOB) oder externe Dateireferenzen (BFILE) in Oracle-Datenbanken zu verwalten. Nicht mehr benötigte Deskriptoren sollten immer explizit freigegeben werden, um Speicherlecks zu vermeiden.
Intern verwaltet PHP Oracle-Deskriptoren als Objekte der Klasse OCILob. Alternativ kann statt der prozeduralen Funktion oci_free_descriptor() auch die Methode OCILob::free() aufgerufen werden – beide sind funktional gleichwertig.
Es ist ratsam, Deskriptoren nach dem Schreiben oder Lesen von LOB-Daten sowie nach dem Binden an eine SQL-Anweisung explizit freizugeben, sobald sie nicht mehr benötigt werden. Besonders in Schleifen oder bei wiederholten Datenbankoperationen kann das Vergessen der Freigabe zu einem erhöhten Speicherverbrauch führen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $descriptor Pflicht | OCILob | Ein gültiges LOB- oder FILE-Deskriptorobjekt, das zuvor mit oci_new_descriptor() erstellt wurde. |
Rückgabewert
true bei Erfolg zurück, false bei einem Fehler (z. B. wenn der Deskriptor bereits freigegeben wurde oder ungültig ist).Beispiele
CLOB in Oracle schreiben und Deskriptor freigeben
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$sql = "INSERT INTO meine_tabelle (id, inhalt) VALUES (:id, EMPTY_CLOB()) RETURNING inhalt INTO :lob";
$stmt = oci_parse($conn, $sql);
$lob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ':id', $id);
oci_bind_by_name($stmt, ':lob', $lob, -1, OCI_B_CLOB);
$id = 42;
oci_execute($stmt, OCI_NO_AUTO_COMMIT);
$lob->save('Das ist der gespeicherte Textinhalt des CLOB.');
oci_commit($conn);
// Deskriptor freigeben
oci_free_descriptor($lob);
// Alternativ: $lob->free();
oci_free_statement($stmt);
oci_close($conn);
echo "CLOB erfolgreich gespeichert und Deskriptor freigegeben.";
?>
BLOB lesen und Deskriptor freigeben
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$sql = "SELECT bild FROM produkte WHERE id = :id";
$stmt = oci_parse($conn, $sql);
$id = 1;
oci_bind_by_name($stmt, ':id', $id);
oci_execute($stmt);
$row = oci_fetch_array($stmt, OCI_ASSOC | OCI_RETURN_LOBS);
if ($row) {
$bildDaten = $row['BILD']; // BLOB-Inhalt als String
echo 'Bildgröße: ' . strlen($bildDaten) . ' Bytes';
} else {
echo 'Kein Datensatz gefunden.';
}
// Bei OCI_RETURN_LOBS wird der Deskriptor intern automatisch freigegeben.
// Bei manueller Verwaltung explizit freigeben:
// oci_free_descriptor($lob);
oci_free_statement($stmt);
oci_close($conn);
?>
// Wichtig · Fallstricke
Speicherverwaltung: Werden Deskriptoren in Schleifen erstellt, aber nicht freigegeben, kann der PHP-Prozess erheblich Speicher ansammeln. Immer oci_free_descriptor() oder $lob->free() aufrufen, wenn der Deskriptor nicht mehr benötigt wird.
Doppelte Freigabe: Ein bereits freigegebener Deskriptor darf nicht erneut freigegeben werden. Setzen Sie die Variable nach der Freigabe auf null, um versehentliche Doppelfreigaben zu vermeiden: oci_free_descriptor($lob); $lob = null;
OCI_RETURN_LOBS: Wenn beim Abrufen von Daten OCI_RETURN_LOBS als Flag verwendet wird, liest PHP den LOB-Inhalt automatisch und gibt den Deskriptor intern frei – ein manuelles Freigeben ist dann nicht erforderlich.