AJAX, PHP, Singleton Pattern
Jo
- php
0 Tom0 Jo0 Tom0 Jo0 Bademeister0 Tom
2 Sven Rautenberg0 dedlfix
Hallo.
Wenn ich mit per AJAX asynchron etwas aus einer Datenbank abrufe und dafür ein PHP Skript aufrufen muss welches die gleiche Klasse verwendet die schon aufgerufen ist im aktuellen Dokument, nochmal verwenden?
Also ich meine kann ich das als Singleton-Pattern implementieren so das ich nicht erneut ein Objekt erstellen muss?
Gruß,
jo
Hello,
Wenn ich mit per AJAX asynchron etwas aus einer Datenbank abrufe und dafür ein PHP Skript aufrufen muss welches die gleiche Klasse verwendet die schon aufgerufen ist im aktuellen Dokument, nochmal verwenden?
Also ich meine kann ich das als Singleton-Pattern implementieren so das ich nicht erneut ein Objekt erstellen muss?
Interessante Idee.
Es sind zwei unterschiedliche Requests und damit zwei unabhängige Threads.
Du müsstest die erstmal über die Session synchronisieren und dann z.B. gemeinsamen Speicher verwalten lassen.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Jo!
Es sind zwei unterschiedliche Requests und damit zwei unabhängige Threads.
Du müsstest die erstmal über die Session synchronisieren und dann z.B. gemeinsamen Speicher verwalten lassen.
Wie meinen?
Also das Objekt in einer Session ablagern oder was meinst du?
Wie soll das alles gehen?
Hello,
Es sind zwei unterschiedliche Requests und damit zwei unabhängige Threads.
Du müsstest die erstmal über die Session synchronisieren und dann z.B. gemeinsamen Speicher verwalten lassen.Wie meinen?
Also das Objekt in einer Session ablagern oder was meinst du?
Das wird viel zu viel Zeit verschlingen.
Du müsstest mit shared Memory arbeiten.
Ich befürchte, dass das in PHP nicht vorgesehen ist, Objekte im Shared Memory anzulegen.
Nun bin ich selber ganz gespannt.
http://de3.php.net/shmop
http://php.net/manual/en/ref.shmop.php
Ob das geht, weiß ich nicht.
Das Objekt müsste ja fortbestehen, wenn das Script endet, denn vom Client könnten ja gerade dann immer noch XMLHttpRequests kommen vom Client.
Mal Dir mal ein Zeitdiagramm. :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Ich werde mir die Aufgabe mal zurückstellen denn mir fehlt leider die Zeit um sowas auszuprobieren. So ist das manchmal ;)
Danke trotzdem.
So long... JO
Hi Tom,
»» Also das Objekt in einer Session ablagern oder was meinst du?
Das wird viel zu viel Zeit verschlingen.
Ich wuerde diese Option nicht kategorisch ausschliessen. Objekte zu serialisieren, ist nicht notwendigerweise sehr aufwaendig. Kann jedenfalls je nach Einzelfall erheblich schneller sein als, was Jo als Alternative schrieb, das Objekt neu zu erstellen.
Oder?
Haengt aber natuerlich vom konkreten Fall ab, insofern habe ich keinerlei Meinung dazu, ob es in Jos Fall vernuenftig sein koennte.
Viele Gruesse,
der Bademeister
Hello,
»» Also das Objekt in einer Session ablagern oder was meinst du?
Das wird viel zu viel Zeit verschlingen.
Ich wuerde diese Option nicht kategorisch ausschliessen. Objekte zu serialisieren, ist nicht notwendigerweise sehr aufwaendig. Kann jedenfalls je nach Einzelfall erheblich schneller sein als, was Jo als Alternative schrieb, das Objekt neu zu erstellen.
Oder?Haengt aber natuerlich vom konkreten Fall ab, insofern habe ich keinerlei Meinung dazu, ob es in Jos Fall vernuenftig sein koennte.
Klar. Und das wäre mWn auch die einzige von PHP vorgesehene Möglichkeit, ein Objekt über einen Zyklus zu retten. Kommt nun darauf an, was drin steckt.
Außerdem: wann soll es serialisiert und abgelegt werden? Wenn das Script endet?
Da stellt sich mir jetzt die Frage, wann der Client mit dem XMLHttp-Request frühestens anfängt. Der benötigt dann ja auch dieselbe Session-Datei. Die ist aber noch gesperrt, solange das Script nicht beendet ist.
Manchmal reicht es aber auch, wenn man auf zusätzlichen OOP-Overhead verzichtet und einfach die Daten in der Session ablegt, also z.B. das Ergebnis eines Requests.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Moin!
Wenn ich mit per AJAX asynchron etwas aus einer Datenbank abrufe und dafür ein PHP Skript aufrufen muss welches die gleiche Klasse verwendet die schon aufgerufen ist im aktuellen Dokument, nochmal verwenden?
Also ich meine kann ich das als Singleton-Pattern implementieren so das ich nicht erneut ein Objekt erstellen muss?
Dein Wunsch kann kaum erfüllt werden, weil du etwas willst, was man in PHP normalerweise nicht will. Deswegen auch Toms etwas kryptische Antwort.
Ein Singleton lebt in PHP nur vom Zeitpunkt seiner Instanziierung innerhalb des aufgerufenen Skripts bis zum Ende dieses Skripts. Und zwar PRO REQUEST separat. Es ist also in dem Sinne gar kein wirkliches, serverübergreifendes Singleton.
Insofern ist dein Versuch, einen zweiten HTTP-Request über dasselbe Singleton laufen zu lassen, schon von vornherein zum Scheitern verurteilt, weil es in jedem Fall neu instanziiert werden würde, vollkommen unabhängig davon, was in dem Request davor passierte.
Und auch der Versuch, das Singleton irgendwie in einem Speicherbereich zwischenzuparken hilft nicht viel, weil das im Prinzip wirklich nur die Objektvariablen hinüberrettet, nicht jedoch die Datenbankconnection oder sonstige Ressourcen. Die müssen beim Wiederbeleben des Objekts so oder so neu angebunden werden.
Im Grunde genommen würdest du mit dem Versuch, das Singleton zu persistieren, sehr viel Aufwand verursachen, ohne auch nur den geringsten Vorteil zu erzielen.
- Sven Rautenberg
echo $begrüßung;
Wenn ich mit per AJAX asynchron etwas aus einer Datenbank abrufe und dafür ein PHP Skript aufrufen muss welches die gleiche Klasse verwendet die schon aufgerufen ist im aktuellen Dokument, nochmal verwenden?
Was genau meinst du mit "aktuelles Dokument"? Doch nicht etwa das, was der Browser gerade anzeigt und der Webserver längst vergessen hat?
Also ich meine kann ich das als Singleton-Pattern implementieren so das ich nicht erneut ein Objekt erstellen muss?
Jede Instanz eines Scripts läuft in einem separaten Bereich. Jede Instanz muss für die Initialisierung ihrer notwendigen Ressourcen selbst sorgen. So die Grundregel. Es gibt Sachen wie Shared Memory und persistente Datenbankverbindungen, aber die solltest du nur mit Wissen um diese Techniken, reichlich Tests und Erfahrung produktiv einsetzen. Das Wissen stellt dabei weniger ein Problem dar, das bekommst du im Netz.
echo "$verabschiedung $name";