Start · Sprachen · PHP · Referenz · COMPersistHelper

COMPersistHelper

Klasse

Verbessert die Interoperabilität von COM und PHP bezüglich <code>open_basedir</code> und Streams beim Persistieren von COM-Objekten.

seit PHP 5.0.0 Kategorie: misc

Signatur

class COMPersistHelper

Beschreibung

COMPersistHelper ist eine Hilfsklasse aus der PHP-COM-Erweiterung, die die Arbeit mit COM-Objekten vereinfacht, die Persistenz-Interfaces implementieren (z. B. IPersistStream, IPersistStreamInit oder IPersistFile). Sie vermittelt zwischen der COM-Welt und PHPs Dateisystem-Sicherheitsmechanismen wie open_basedir sowie dem PHP-Stream-System.

Das Problem ohne diese Hilfsklasse: Wenn ein COM-Objekt Daten direkt in eine Datei schreiben oder lesen möchte, kennt es PHPs open_basedir-Restriktionen nicht und umgeht sie potenziell. COMPersistHelper leitet Datei- und Stream-Operationen über PHPs eigene Mechanismen um, sodass Sicherheitsrichtlinien gewahrt bleiben.

Die Klasse wird typischerweise instanziiert, indem eine COM-Objekt-Instanz übergeben wird, die ein unterstütztes Persistenz-Interface implementiert. Anschließend können Methoden wie SaveToFile(), LoadFromFile(), SaveToStream() oder LoadFromStream() aufgerufen werden, um COM-Objektzustände sicher zu speichern und wiederherzustellen.

Diese Klasse ist vor allem in Windows-Umgebungen relevant, in denen PHP COM-Komponenten (z. B. ActiveX-Steuerelemente, Office-Automation-Objekte) nutzt und dabei die serverseitigen Sicherheitsrichtlinien einhalten muss.

Parameter

Name Typ Default Beschreibung
$variant Pflicht variant|object Ein COM-Objekt, das mindestens eines der unterstützten Persistenz-Interfaces (IPersistFile, IPersistStream oder IPersistStreamInit) implementiert.

Rückgabewert

Typ

Beispiele

COM-Objekt in Datei speichern und laden

<?php
// Beispiel: Ein COM-Objekt, das IPersistFile implementiert,
// wird über COMPersistHelper gespeichert und geladen.

// COM-Objekt instanziieren (Beispiel: ein fiktives ActiveX-Objekt)
$com = new COM('Some.PersistableObject');

// COMPersistHelper als Wrapper erzeugen
$helper = new COMPersistHelper($com);

// Zustand des COM-Objekts in eine Datei speichern
// (Pfad wird über PHPs open_basedir validiert)
$helper->SaveToFile('C:\\temp\\com_state.dat');

echo "COM-Objekt erfolgreich gespeichert." . PHP_EOL;

// Zustand aus der Datei wiederherstellen
$helper->LoadFromFile('C:\\temp\\com_state.dat');

echo "COM-Objekt erfolgreich geladen." . PHP_EOL;
?>
COM-Objekt erfolgreich gespeichert. COM-Objekt erfolgreich geladen.

COM-Objektzustand über PHP-Stream speichern

<?php
// Zustand eines COM-Objekts in einen PHP-Stream schreiben
$com = new COM('Some.PersistableStreamObject');
$helper = new COMPersistHelper($com);

// PHP-Stream öffnen (z. B. temporäre Datei)
$stream = fopen('php://temp', 'r+');

// Zustand in den Stream persistieren
$helper->SaveToStream($stream);

// Stream zurückspulen und Inhalt lesen
rewind($stream);
$data = stream_get_contents($stream);
echo "Gespeicherte Bytes: " . strlen($data) . PHP_EOL;

fclose($stream);
?>
Gespeicherte Bytes: 128

// Wichtig · Fallstricke

Plattformabhängigkeit: COMPersistHelper steht ausschließlich unter Windows zur Verfügung, da es auf der COM-Erweiterung (ext/com_dotnet) basiert. PHP muss mit --enable-com-dotnet kompiliert oder die Erweiterung muss geladen sein.

Sicherheit: Die Klasse wurde explizit entwickelt, um zu verhindern, dass COM-Objekte open_basedir-Beschränkungen umgehen. Ohne diesen Helper könnten COM-Objekte auf Dateipfade außerhalb des erlaubten Verzeichnisses zugreifen. Bei produktiven Anwendungen sollte open_basedir immer konfiguriert sein.

Voraussetzung: Das übergebene COM-Objekt muss tatsächlich eines der unterstützten Persistenz-Interfaces implementieren. Andernfalls schlägt die Instanziierung oder der jeweilige Methoden-Aufruf mit einem COM-Fehler fehl.

Dokumentation: Die offizielle PHP-Dokumentation zu dieser Klasse ist spärlich. Beim Einsatz in komplexen Szenarien empfiehlt sich ein Blick in den PHP-Quellcode (ext/com_dotnet/com_persist.c).