Request- und Sessionübergreifende Datenhaltung

Hi,

ich wollte mal fragen, ob es im Standard PHP möglich ist, Daten für alle
Benutzer und Requests zugänglich zu machen, ohne diese jedesmal aus
Dateien oder ähnlichem Laden zu müssen.

Requestübergreifend habe ich bisher die Session dazu verwendet um
Objekte serialisiert darin abzulegen. Allerdings habe ich auch Daten,
die nicht an den Benutzer gebunden sind, wie zum Beispiel Einstellungen
oder Sprachdateien.

Es wäre natürlich schön, wenn man diese einfach (wie bei der Session) in
einer PHP Variable schreiben könnte und ab dann kann man bei jedem
Request wieder darauf zugreifen.

Ist dies möglich oder in irgendeiner Form simulierbar?
PS: Bei Java wäre dies der Application Scope. :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mo, 24 September 2007 18:37 ] [ ID #1828207 ]

Re: Request- und Sessionübergreifende Datenhaltung

Christoph Herrmann schrieb:

> ich wollte mal fragen, ob es im Standard PHP möglich ist, Daten für alle
> Benutzer und Requests zugänglich zu machen, ohne diese jedesmal aus
> Dateien oder ähnlichem Laden zu müssen.

Das geht meines Wissens nach mit ZendPlatform, aber nicht mit dem
"normalen" PHP.

> Ist dies möglich oder in irgendeiner Form simulierbar?
> PS: Bei Java wäre dies der Application Scope. :)

Meine Java-Kenntnisse sind nicht so ausgeprägt, aber ein
Application-Server (wie JBoss) läuft ja auch die ganze Zeit im
Hintergrund. Bei PHP ist das ja "bloß" ein Apache, der mit der Anwendung
nicht direkt verzahnt ist...

Gruß
David
David Fuhr [ Mo, 24 September 2007 18:48 ] [ ID #1828209 ]

Re: Request- und Sessionübergreifende Datenhaltung

Christoph Herrmann schrieb:

>ich wollte mal fragen, ob es im Standard PHP möglich ist, Daten für alle
>Benutzer und Requests zugänglich zu machen, ohne diese jedesmal aus Dateien
>oder ähnlichem Laden zu müssen.

Nicht so wirklich. Es gibt http://php.net/manual/en/ref.sem.php, das ist aber
Unix-spezifisch und auch dort nicht standardmäßig aktiviert.

Alternativ könntest du das Session-System missbrauchen, indem du eine
statische Session-ID vorgibst. Das funktioniert zwar überall, wenn du aber
gleichzeitig Sessions nutzen willst ist es etwas frimmelig.

Ansonsten: Was anderes als "aus Dateien laden" macht Session ja auch nicht,
ein Eigenbau unter Zuhilfenahme von serialize ist also ziemlich schmerzfrei.
Der Applikation muss dann lediglich ein schreibbarer Pfad mitgegeben werden.

--
Wolfgang Fellger
Wolfgang Fellger [ Mo, 24 September 2007 19:21 ] [ ID #1828212 ]

Re: Request- und Sessionübergreifende Datenhaltung

Wolfgang Fellger schrieb:
> Nicht so wirklich. Es gibt http://php.net/manual/en/ref.sem.php, das ist aber
> Unix-spezifisch und auch dort nicht standardmäßig aktiviert.

Will nicht unbedingt Unix voraussetzen...

> Alternativ könntest du das Session-System missbrauchen, indem du eine
> statische Session-ID vorgibst. Das funktioniert zwar überall, wenn du aber
> gleichzeitig Sessions nutzen willst ist es etwas frimmelig.

Missbrauche ungern die Session dafür, gerade weil ich noch Sessions
nebenher nutzen will.

> Ansonsten: Was anderes als "aus Dateien laden" macht Session ja auch nicht,
> ein Eigenbau unter Zuhilfenahme von serialize ist also ziemlich schmerzfrei.
> Der Applikation muss dann lediglich ein schreibbarer Pfad mitgegeben werden.

für Einstellungsdateien noch handlebar, aber für Dinge wie
ConnectionPooling wohl nicht so das Ware denk ich mal. :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Mo, 24 September 2007 19:24 ] [ ID #1828213 ]

Re: Request- und Sessionübergreifende Datenhaltung

Hallo Wolfgang,

> Alternativ könntest du das Session-System missbrauchen, indem du eine
> statische Session-ID vorgibst. Das funktioniert zwar überall, wenn du a=
ber
> gleichzeitig Sessions nutzen willst ist es etwas frimmelig.

Könnte das ganze vielleicht doch funktionieren, wenn ich folgende
Schritte ausführe:
1=2E "Meine" Session-ID sichern
2=2E Auf die globale Session-ID umstellen (irgendein fester Wert)
3=2E Daten aus dieser Session laden
4=2E auf meine in 1) gespeicherte Session-ID zurückstellen

Sicherheitskritisch ist natürlich die Voraussetzung in Punkt 2, da
hier die Session-ID ein fester Wert sein muss, damit auch jede Instanz
der PHP-Anwendung daruf Zugriff erlangen kann.
Sieht hier jemand eine andere Lösung? Funktioniert das überhaupt?


Gruß,

Markus
cipher [ Di, 25 September 2007 08:54 ] [ ID #1829003 ]

Re: Request- und Sessionübergreifende Datenhaltung

Christoph Herrmann schrieb:
> Hi,
>
> ich wollte mal fragen, ob es im Standard PHP möglich ist, Daten für alle
> Benutzer und Requests zugänglich zu machen, ohne diese jedesmal aus
> Dateien oder ähnlichem Laden zu müssen.
>
> Requestübergreifend habe ich bisher die Session dazu verwendet um
> Objekte serialisiert darin abzulegen. Allerdings habe ich auch Daten,
> die nicht an den Benutzer gebunden sind, wie zum Beispiel Einstellungen
> oder Sprachdateien.
>
> Es wäre natürlich schön, wenn man diese einfach (wie bei der Session) in
> einer PHP Variable schreiben könnte und ab dann kann man bei jedem
> Request wieder darauf zugreifen.
>
> Ist dies möglich oder in irgendeiner Form simulierbar?

Ja, nutze Shared Memory:
http://php.net/shmop

Gruß,
Torsten
thorny [ Di, 25 September 2007 09:57 ] [ ID #1829005 ]

Re: Request- und Sessionübergreifende Datenhaltung

Christoph Herrmann schrieb:

> ich wollte mal fragen, ob es im Standard PHP möglich ist, Daten für alle
> Benutzer und Requests zugänglich zu machen, ohne diese jedesmal aus
> Dateien oder ähnlichem Laden zu müssen.

Nein. Wie auch, irgendwo müssen die Daten ja herkommen ;)

> Allerdings habe ich auch Daten,
> die nicht an den Benutzer gebunden sind, wie zum Beispiel Einstellungen
> oder Sprachdateien.

Das macht man üblicherweise mit einer Konfigurationsdatei per include
oder einer Konfigurationstabelle mit SQL/SELECT

> Es wäre natürlich schön, wenn man diese einfach (wie bei der Session) in
> einer PHP Variable schreiben könnte und ab dann kann man bei jedem
> Request wieder darauf zugreifen.

Spontane Idee: Du könntest z.B. die Session Funktionen selber schreiben
(session_set_save_handler()), einen globalen Raum ($_SESSION['global']
oder so) definieren und diesen unabhängig von der Session seperat
speichern/auslesen...
so [ Di, 25 September 2007 12:43 ] [ ID #1829014 ]

Re: Request- und Sessionübergreifende Datenhaltung

Suat Özgür schrieb:
> Christoph Herrmann schrieb:
>
>> ich wollte mal fragen, ob es im Standard PHP möglich ist, Daten für alle
>> Benutzer und Requests zugänglich zu machen, ohne diese jedesmal aus
>> Dateien oder ähnlichem Laden zu müssen.
>
> Nein. Wie auch, irgendwo müssen die Daten ja herkommen ;)

Echte Applikationsserver halten solche Sachen im Arbeitsspeicher, was
deutlich besser skaliert als aus Dateien oder Datenbanken zu lesen. Und
wenn der App-Server die DB-Verbindung aufrecht erhält, muss auch nicht
jedes mal eine neue Verbindung aufgebaut werden.

Gruß
David
David Fuhr [ Di, 25 September 2007 12:57 ] [ ID #1829016 ]

Re: Request- und Sessionübergreifende Datenhaltung

cipher schrieb:

>Könnte das ganze vielleicht doch funktionieren, wenn ich folgende
>Schritte ausführe:
>[...]

Das war's, was ich mit "frimmeln" meinte. Dann lieber gleich
unserialize(file_get_contents(...)) und wie von Suat beschrieben mit einem
eigenen Session-Handler kombinieren.

--
Wolfgang Fellger
Wolfgang Fellger [ Di, 25 September 2007 13:07 ] [ ID #1829017 ]

Re: Request- und Sessionübergreifende Datenhaltung

Suat Özgür schrieb:
> Nein. Wie auch, irgendwo müssen die Daten ja herkommen ;)

Klar, beim ersten Aufruf werden die Daten aus den Dateien/Datenbank
geladen. Nur müssen bisher diese Daten bei jedem Request geladen werden
(auch wenn ich nur die Dateien lade, die ich dann auch wirklich brauche
kostet das Zeit). Könnte ich die Daten einmal komplett laden und ab dann
in einer Variable wie die Sessiondaten unterbringen wäre es am idealsten.

Nur sollen die Daten dann nicht mit jeder Session neu geladen werden,
sondern einmal beim Serverstart beim ersten Seitenaufruf.

> Das macht man üblicherweise mit einer Konfigurationsdatei per include
> oder einer Konfigurationstabelle mit SQL/SELECT

Wie oben erwähnt habe ich so etwas bisher als Lösung. Ich lade meine
Einstellungen beim ersten Zugriff aus der jeweiligen Datei und behalte
diese dann intern vor, falls die gleiche Datei mehrmals benötigt wird.
Nur hab ich gemerkt, dass dies recht viel Zeit kostet wenn ich so 5 - 10
Dateien laden muss (was zwar selten vorkommt, aber doch unnötig Zeit
ist, da sich eh nie/selten was an den Einstellungen ändert).

Meine Daten haben dabei alle folgenden Aufbau (als Beispiel
Datenbankeinstellungen):
<?php
return array('hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => '...');
?>

Laden tu ich diese einfach mit require. Oder wüsste jemand eine
Möglichkeit dies performanter zu gestalten? Format ist mir relativ egal,
solang es lesbar ist und Dateibasierend (Datenbank will ich nicht, vor
allem kann ich schlecht Datenbankeinstellungen aus der Datenbank lesen :) ).

> Spontane Idee: Du könntest z.B. die Session Funktionen selber schreiben
> (session_set_save_handler()), einen globalen Raum ($_SESSION['global']
> oder so) definieren und diesen unabhängig von der Session seperat
> speichern/auslesen...

ich möchte ungern die Session dafür hernehmen... Dann doch lieber etwas
langsamer und dafür sauber ohne Vergewaltigung eines anderen Systems. :)

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Di, 25 September 2007 13:18 ] [ ID #1829019 ]

Re: Request- und Sessionübergreifende Datenhaltung

David Fuhr schrieb:
> Echte Applikationsserver halten solche Sachen im Arbeitsspeicher, was
> deutlich besser skaliert als aus Dateien oder Datenbanken zu lesen. Und
> wenn der App-Server die DB-Verbindung aufrecht erhält, muss auch nicht
> jedes mal eine neue Verbindung aufgebaut werden.

genau das möchte ich damit bezwecken... Nebeneffekt wäre dann die
Möglichkeit die Datenbankverbindungen aufrecht erhalten, also Connection
Pooling.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Di, 25 September 2007 13:19 ] [ ID #1829020 ]

Re: Request- und Sessionübergreifende Datenhaltung

Christoph Herrmann schrieb:
> Hi,
>
> ich wollte mal fragen, ob es im Standard PHP möglich ist, Daten für alle
> Benutzer und Requests zugänglich zu machen, ohne diese jedesmal aus
> Dateien oder ähnlichem Laden zu müssen.

Dazu kann man APC nutzen:

http://de2.php.net/apc
http://de2.php.net/manual/de/function.apc-store.php

Hier legst du Objekte/Variablen .. unter einem Identifier ab auf den du
später wieder zugreifen kannst.
Du kannst Verfallszeiten spezifizieren etc. je nachdem was du vorhast
könnte das was für dich sein.
Stefan Braumeister [ Di, 25 September 2007 13:34 ] [ ID #1829022 ]

Re: Request- und Sessionübergreifende Datenhaltung

Christoph Herrmann schrieb:

>Könnte ich die Daten einmal komplett laden und ab dann in
>einer Variable wie die Sessiondaten unterbringen wäre es am idealsten.

Ja was glaubst du was Session tut? ;-) Das macht auch nichts anderes
als aus der Session-ID einen Dateinamen zu bauen, die Datei einzulesen
und an unserialize zu übergeben. Bei jedem Skriptaufruf.

>ich möchte ungern die Session dafür hernehmen... Dann doch lieber etwas
>langsamer und dafür sauber ohne Vergewaltigung eines anderen Systems. :)

Dann musst du eben manuell eine Funktion zum Laden und Speichern aufrufen.

Trotzdem kannst du mit serialize/unserialize beliebig komplexe Strukturen
ablegen, was präzise so funktioniert wie mit den Sessions auch. Du könntest
hier sogar etwas bauen, das wahlweise in Dateien oder, falls verfügbar, im
Shared Memory Daten speichert. Für Dateien ist die Implementation quasi ein
Einzeiler.

--
Wolfgang Fellger
Wolfgang Fellger [ Di, 25 September 2007 13:34 ] [ ID #1829023 ]

Re: Request- und Sessionübergreifende Datenhaltung

Christoph Herrmann schrieb:

> Laden tu ich diese einfach mit require. Oder wüsste jemand eine
> Möglichkeit dies performanter zu gestalten? Format ist mir relativ egal,
> solang es lesbar ist und Dateibasierend (Datenbank will ich nicht, vor
> allem kann ich schlecht Datenbankeinstellungen aus der Datenbank lesen
> :) ).

Wenn's um Performance geht: Datenbanken sind auf schnelle Zugriffe
spezialisiert, von daher ist das theoretisch (subjektiver Eindruck: auch
praktisch, ich hab' das aber noch nie evaluiert) auch performanter als
das hauseigene Sessionhandling über Dateien. Mehr oder weniger statische
Konfigurationsdaten liefert die DB dann ab dem zweiten Aufruf durch den
Querycache in Nullkommanix aus, die nichtpersistenten Verbindungen sind
lokal oder im Intranet performancemässig eher vernachlässigbar. Die
Sessiontabelle kann man zudem auch noch als HEAP (oder MEMORY?! ->mysql
Doku *g*) definieren wodurch die Daten dann ausschließlich im
Arbeitsspeicher vorgehalten werden (und daher auch futsch sind wenn der
Server abschmiert, daher nur für "unwichtige" Sessiondaten um es nicht
unnötig zu Verkomplizieren).

Die DB-Verbindungsdaten kannst Du dann dreckig zu Fuß in die Datei mit
der DB-Klasse schreiben um das eine include mehr zu sparen :)


Ansonsten dürften statische php-Konfigurationsdateien in Verbindung mit
eAccelerator oder ähnlichem auch recht genügsam durchlaufen.
so [ Di, 25 September 2007 14:10 ] [ ID #1829026 ]

Re: Request- und Sessionübergreifende Datenhaltung

Wolfgang Fellger wrote:

> Shared Memory Daten speichert. Für Dateien ist die Implementation quasi ein
> Einzeiler.

Nicht wenn man Race-Conditions vermeiden möchte.

MfG, Ulf

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ Di, 25 September 2007 17:24 ] [ ID #1829041 ]

Re: Request- und Sessionübergreifende Datenhaltung

Suat Özgür schrieb:
> Wenn's um Performance geht: Datenbanken sind auf schnelle Zugriffe
> spezialisiert, von daher ist das theoretisch (subjektiver Eindruck: auch
> praktisch, ich hab' das aber noch nie evaluiert) auch performanter als
> das hauseigene Sessionhandling über Dateien. Mehr oder weniger statische
> Konfigurationsdaten liefert die DB dann ab dem zweiten Aufruf durch den
> Querycache in Nullkommanix aus, die nichtpersistenten Verbindungen sind
> lokal oder im Intranet performancemässig eher vernachlässigbar. Die
> Sessiontabelle kann man zudem auch noch als HEAP (oder MEMORY?! ->mysql
> Doku *g*) definieren wodurch die Daten dann ausschließlich im
> Arbeitsspeicher vorgehalten werden (und daher auch futsch sind wenn der
> Server abschmiert, daher nur für "unwichtige" Sessiondaten um es nicht
> unnötig zu Verkomplizieren).

für statische Sachen wie Einstellungen will ich ungern die Datenbank
zumüllen. Aber ich denke ich verschiebe das Problem noch etwas in die
Zukunft, da wahrscheinlich ohne größeren Aufwand nicht viel Verbesserung
zu erwarten ist. :)

> Die DB-Verbindungsdaten kannst Du dann dreckig zu Fuß in die Datei mit
> der DB-Klasse schreiben um das eine include mehr zu sparen :)

ich will nicht auf Teufel komm raus includes sparen, sonst würde ich an
ziemlich vielen Stellen was ändern müssen. :)

> Ansonsten dürften statische php-Konfigurationsdateien in Verbindung mit
> eAccelerator oder ähnlichem auch recht genügsam durchlaufen.

Hab ich noch nie probiert, da ich dies auf dem Webspace nicht zur
Verfügung habe.

--
Mit freundlichen Grüßen,
Christoph Herrmann

http://dragonprojects.de/
Christoph Herrmann [ Di, 25 September 2007 17:57 ] [ ID #1829042 ]
PHP » de.comp.lang.php.misc » Request- und Sessionübergreifende Datenhaltung

Vorheriges Thema: Backslash & Übergabe an mysql
Nächstes Thema: nochmal utf-8