Philipp Hasenfratz: Session-Management und applikationsweit verfügbare Objekte

Beitrag lesen

Halihallo Eisbär

Serialisierung von Objekten, sei hier genannt. Wobei du ja eben genau das auslesen von Dateien verhindern willst. Aber du könntest die serialisierten Objekte in einem globalen Prozess speichern, mitdem du dann kommunizierst.

Sorry, was versteht man unter "Serialisierung von Objekten"?

Objekte sind ja komplexe Strukturen; diese kann man nicht einfach in einer Datei oder in den Speicher abbilden. Dazu braucht man eine Art "Kodierung" oder Abbildungsvorschrift, wie man diese Darstellen kann. Das Umwandeln/Abbilden einer komplexen Datenstruktur nennt man Serialisierung.

Beispiel:

$db = new Database;

dann hat $db vielleicht folgende Eigenschaften:

$VAR1 = {
   dsn => 'hello',
   login => 'loginname',
   pwd => 'pwd',
   data => [$VAR2,$VAR3,$VAR4]
}

$VAR2 = {
   name => 'Hasenfratz',
   vorname => 'Philipp',
   email => 'philipp.hasenfratz@gmx.net',
}

$VAR3 = {...}

Diese Struktur musst du irgendwie in ein gut leserliches Format in eine Datei schreiben können. Eine mögliche Serialisierung dieser Struktur ist z. B. XML.

<Database>
   <var name="login">loginname</var>
   <var name="pwd">pwd</var>
   <data type="array">
      <item type="hash">
         <var name="name">Hasenfratz</var>
         ...
      </item>
      ...
   </data>
</Database>

Diese Struktur lässt sich dann "ziemlich" einfach einlesen und bearbeiten => dies ist eine mögliche Serialisierung des Objektes.

Bestimmt. Aber nicht so einfach, wie in ASP ;)
Wenn du sicherstellen kannst, dass ein Script immer läuft, kannst du eine Socketkommunikation iniziieren und die Daten werden dann von diesem "global-scope-script" zur Verfügung gestellt. Christian ist glaub ich "im Moment" damit beschäftigt, das Forum etwa mit der gleichen "Technik" auszustatten.

Wie perfomant ist eine solche Sockketkommunikation zwischen zwei Prozessen (auf dem gleichen Server)?

Nun, wenn das auf dem gleichen Computer geschieht (was bei dir ja so ist), sind sie ziemlich schnell (zur Erinnerung: HTTP, FTP, Gopher, ... alles Socketverbindungen). Aber ich kann dir keine Referenzwerte nennen. Was ich jedoch sagen kann, dass z. B. Datenbankschnittstellen (eg. mysql) auch darauf basieren und bekanntlich hat noch "fast" niemand über die Performance gesprochen und wenn überhaupt, dann über die Performance der Datenbank, nicht der Verbindung (zumindest bei grossen Datenbeständen). Also: Über die Performance brauchst du dir glaub ich nicht den Kopf zerbrechen. Wohl eher, ob du es schaffst, dass dein Script wirklich sauber und ohne Fehler arbeitet => Stabilität. Du _musst_ auf jeden Fall sicherstellen, das der Daten-Server _immer_ verfügbar ist und stabil läuft. Das ist keine sehr einfach Aufgabe! - Zudem habe ich etwas bedenken, wenn du nur einen Daten-Server nimmst. Ein Datenserver, mehrere clients? - Das bremst unnötig aus. Eine Möglichkeit wäre es, ca. 10 Datenserver zu preforken (also beim ersten Start gleich 10 Abbilder, die dann jeweis 10 Clients zur selben Zeit bedienen können), oder einfach forken, wenn ein neuer Client Daten braucht (du musst mit fork ja nicht gleich alle Dateien neu einlesen, das OS kopiert den ganzen Interpreter und die Daten für dich).

Lohnt sich der Aufwand im Vergleich zum Aufbau eines DBI-Connects zu einem SQL-Server?

Der ist etwa genau so schnell, wie eine Socketverbindung, IMO sogar das selbe ;)

Wie aufwendig ist die programmiertechnische Umsetzung?

Kommt darauf an. Wie komplex ist denn der Datenaustausch? - Wie komplex die Objekte.

Gibt es vergleichbar zu CGI und DBI bereits Module, die einem den Aufbau dieser Kommunikation zwischen Prozessen erleichtert?

Vielleicht SOAP (SimpleObjectAccessProtocol) oder RPC (RemoteProcedureCall). Beides geht auch über Socketverbindungen (mit einigen Tricks).

Kannst ja mal die Doku zu SOAP::Lite anschauen.

Was für Datenobjekte können zwischen zwei Prozessen übertragen werden?
Ist dies nur ein selbstgestalteter Steram (z.B. XML) den man selsbt formatieren und am anderen Ende wieder parsen muss?
Gibt es die Möglichkeit direkt Perl-Objekte wie SCALAR, ARRAY, HASH und eigene, durch Perl-Module definierte Objekte, über diese Socketkommunikation zu transportieren?

Direkt nein. Indirekt über die genannte Serialisierung. SOAP und RPC verwenden z. B. Serializer. Du könntest auch ein eigenes Modul schreiben, was eine Datenstruktur in einen XML-Stream abbildet.

Ja, das geht schon, aber wie du selber sagst: das ist eigentlich keine Eigenschaft einer Programmiersprache, sondern vielmehr eines Webservers.

In diesem Fall suche ich einen Perl-basierten Applicationserver, bzw. einen Applicationserver mit Perl als eingebaute Programmiersprache ;-)

au waya ;)

Kennt jemand solche Perl-Module, bzw. Apache-Erweiterungen?

Bin vielleicht etwas auf SOAP und RPC fixiert. Kann nur diese nennen. Vielleicht weiss sonst noch wer was.

Viele Grüsse

Philipp