Start · Sprachen · PHP · Referenz · oci_free_descriptor

oci_free_descriptor

Funktion

Gibt einen LOB- oder FILE-Deskriptor frei, der zuvor mit <code>oci_new_descriptor()</code> erstellt wurde.

seit PHP 5.0.0 Kategorie: db

Signatur

oci_free_descriptor(OCILob $descriptor): bool

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

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

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.";
?>
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);
?>
Bildgröße: 204800 Bytes

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