FRAGEN
DETAILS
Ich benutze
Das Skript verwendet asynchrone Ajax-Anforderungen, um Joomla-Variablen mehrmals abzurufen und festzulegen. Die Daten, die ich in der Sitzung speichere, sind ein Array. Zwischenzeitlich gehen einige der Array-Daten verloren. Es scheint viel konsistenter zu passieren, sobald sich der Benutzer anmeldet und das Skript verwendet.
Um ehrlich zu sein, ich bin mir nicht wirklich sicher, was das Problem ist, aber ich beginne zu denken, dass mein Code unter einer Wettlaufsituation leidet. Ich denke, dass Joomla versucht, die Sitzungsinformationen zu lesen, bevor es fertig geschrieben ist oder es gerade nicht gesetzt wird. Die fehlenden Informationen scheinen zufällig ausgewählt zu werden, und der Datenverlust tritt zeitweise auf.
SCRIPT1
Skript 1 verwendet eine asynchrone Ajax-Anfrage, um Joomla-Sitzungsvariablen zu erhalten / setzen. Dies wird mehrmals aufgerufen. Designbedingt kann Script 1 erst wieder aufgerufen werden, wenn die Ajax-Antwort erfolgreich ist.
%Vor%Dies ist eine ungefähre Vorstellung von dem Code, den ich in Skript 2 verwende, um auf Joomla zuzugreifen und Sitzungsdaten abzurufen / zu setzen.
SCRIPT2
%Vor%TEST FÜR RENNBEDINGUNGEN
Ich dachte, die Daten könnten überschrieben werden, also habe ich einen kurzen Test mit dem folgenden Code gemacht. Jedes Mal, wenn ich das Sitzungsarray aktualisiere, erstelle ich eine neue Sitzungsvariable mit nur den aktualisierten Daten.
%Vor%In einem anderen Skript, als die Website die Aktualisierung abgeschlossen hat, habe ich jede einzelne Sitzung überprüft, um festzustellen, ob sie eingerichtet wurde.
%Vor%TESTERGEBNISSE
Die Array-Informationen, die in jqid fehlen, fehlten auch in der entsprechenden einzelnen Sitzung (die Sitzung mit nur den aktualisierten Daten), so scheint es, dass es kein Problem ist, dass die Daten überschrieben werden. Ich bin mir nicht sicher, ob dies eine Race-Bedingung widerlegt.
Irgendwelche Vorschläge, was Sie denken könnten und wie Sie dies beheben könnten, wären sehr willkommen.
BEARBEITEN
Auch generalisierte Antworten, wie Race-Bedingungen in Joomla verhindert werden können, sind willkommen. Danke
EDIT2
Ich beginne mich zu fragen, ob es kein Problem mit php5.4 und Joomla ist. Ich habe gehört, dass sie nicht gut zusammen spielen und ich kann mich nicht erinnern, dieses Problem zu haben, bevor ich von php5.3 aktualisiert habe. Ich könnte aber auch falsch liegen.
EDIT3
Ich bin am Ende. Ich habe die Website auf einem anderen Server mit PHP 5.3.10 installiert. Ich habe es zehn oder mehr Mal als nicht eingeloggte Benutzer versucht. Es gab keinen Datenverlust. Ich habe mich dann bei Joomla eingeloggt und die Daten gingen fast jedes Mal verloren, wenn ich auf die Seite zugreife. Wenn ich Joomla Sessions nicht benutzen müsste! GRRRrrrrr
EDIT4
Jetzt verzweifelt werden und alles versuchen. JRequest hat nicht funktioniert, obwohl ich es trotzdem benutzen sollte.
Da das Problem häufiger auftritt, wenn ich mich anmelde, habe ich gedacht, dass es sein muss, weil viel mehr Inhalt in der Sitzung gespeichert ist, als wenn der Benutzer ein Gast ist. Jqid ist ein großes Array, und anstatt es ständig zu aktualisieren, habe ich versucht, mehrere kleinere Arrays zu erstellen und sie jeweils zu aktualisieren. Es hatte absolut keine Wirkung. Wahrscheinlich sollte ich das trotzdem tun.
EDIT5B
Beim Versuch, eine behelfsmäßige Lösung zu finden, habe ich versucht zu testen, ob die Sitzung erfolgreich aktualisiert wurde oder nicht (dies wurde im selben Skript ausgeführt, das die Sitzung aktualisiert hat).
Hier ist der Code, den ich verwendet habe, um jstart zu überprüfen.
%Vor% Das Interessante, was ich fand, war, dass jstart die aktualisierten Informationen während der Überprüfung enthielt, aber bei der Fertigstellung fehlte.
Ich bin nicht wirklich sicher, was das bedeutet, aber ich denke, wenn wir JFactory::getSession()
als Variable behandelt haben, dann wurde die Variable nur für dieses Skript aktualisiert (eine Art wie eine lokale Variable?), Der Datenbankwert für JFactory::getSession()
für was auch immer Grund wurde nicht in die Datenbank geschrieben. Später, als dieses Skript erneut ausgelöst wurde, wurde der alte Wert von JFactory::getSession()
, der in der Datenbank gespeichert wurde, abgerufen.
Ich habe immer noch keine Ahnung, warum die Sitzung nicht in die Datenbank geschrieben wird.
Endlich sieht es so aus, als hätte ich eine Lösung gefunden!
Ich habe zufällig die Fehlerprotokolle in apache_error.log (wamp / logs / apache_error.log) überprüft. Es gab eine Menge sitzungsbezogener Fehler wie
%Vor%Nachdem ich Cometchat ausgeschaltet und den Server neu gestartet hatte, stellte ich fest, dass der Datenverlust der intermittierenden Sitzung zu stoppen schien. Nach der Änderung sind unter apache_error.log
keine Fehler mehr aufgetretenDa das Problem intermittierend ist, bin ich nicht 100% sicher, dass es gelöst ist, aber ich bin zuversichtlich genug, dass ich dies als Lösung geschrieben habe. Ich habe
benutztcometchat Version 3.0.1
Ich werde es weiter testen. Wenn die Lösung hält, werde ich eine aktualisierte Version von Cometchat versuchen und die Ergebnisse veröffentlichen.
UPDATE: Es scheint mit cometchat zu tun zu haben. Ich habe die neueste Version 4.6.0 installiert, aber der Sitzungsverlust tritt immer noch auf. Ich kann das umgehen, indem ich Comeetchat auf den Seiten ausschließe, die mein Skript enthalten.
NÜTZLICHE INFO: Nur für den Fall, dass jemand anderes mit der Joomla-Sitzung zu kämpfen hat - ich fand diese Website ziemlich nützlich. Ссылка
Speziell
%Vor%Obwohl ich keine Lösung für das Problem gefunden habe, habe ich eine Arbeit gefunden. Es ist nicht gut, aber es funktioniert. Wenn die Sitzungsvariable aktualisiert wird, speichern Sie die Informationen in einem Cookie als Backup. Überprüfen Sie später im Skript, ob fehlende Informationen vorhanden sind, und aktualisieren Sie den Cookie nach Bedarf.
Ich würde es lieber nicht so machen, aber es sieht nicht so aus, als hätte ich die Wahl.
Endlich sieht es so aus, als hätte ich eine Lösung gefunden!
Ich habe zufällig die Fehlerprotokolle in apache_error.log (wamp / logs / apache_error.log) überprüft. Es gab eine Menge sitzungsbezogener Fehler wie
%Vor%Nachdem ich Cometchat ausgeschaltet und den Server neu gestartet hatte, stellte ich fest, dass der Datenverlust der intermittierenden Sitzung zu stoppen schien. Nach der Änderung sind unter apache_error.log
keine Fehler mehr aufgetretenDa das Problem intermittierend ist, bin ich nicht 100% sicher, dass es gelöst ist, aber ich bin zuversichtlich genug, dass ich dies als Lösung geschrieben habe. Ich habe
benutztcometchat Version 3.0.1
Ich werde es weiter testen. Wenn die Lösung hält, werde ich eine aktualisierte Version von Cometchat versuchen und die Ergebnisse veröffentlichen.
UPDATE: Es scheint mit cometchat zu tun zu haben. Ich habe die neueste Version 4.6.0 installiert, aber der Sitzungsverlust tritt immer noch auf. Ich kann das umgehen, indem ich Comeetchat auf den Seiten ausschließe, die mein Skript enthalten.
NÜTZLICHE INFO: Nur für den Fall, dass jemand anderes mit der Joomla-Sitzung zu kämpfen hat - ich fand diese Website ziemlich nützlich. Ссылка
Speziell
%Vor%FRAGEN
DETAILS
Ich benutze
Das Skript verwendet asynchrone Ajax-Anforderungen, um Joomla-Variablen mehrmals abzurufen und festzulegen. Die Daten, die ich in der Sitzung speichere, sind ein Array. Zwischenzeitlich gehen einige der Array-Daten verloren. Es scheint viel konsistenter zu passieren, sobald sich der Benutzer anmeldet und das Skript verwendet.
Um ehrlich zu sein, ich bin mir nicht wirklich sicher, was das Problem ist, aber ich beginne zu denken, dass mein Code unter einer Wettlaufsituation leidet. Ich denke, dass Joomla versucht, die Sitzungsinformationen zu lesen, bevor es fertig geschrieben ist oder es gerade nicht gesetzt wird. Die fehlenden Informationen scheinen zufällig ausgewählt zu werden, und der Datenverlust tritt zeitweise auf.
SCRIPT1
Skript 1 verwendet eine asynchrone Ajax-Anfrage, um Joomla-Sitzungsvariablen zu erhalten / setzen. Dies wird mehrmals aufgerufen. Designbedingt kann Script 1 erst wieder aufgerufen werden, wenn die Ajax-Antwort erfolgreich ist.
%Vor%Dies ist eine ungefähre Vorstellung von dem Code, den ich in Skript 2 verwende, um auf Joomla zuzugreifen und Sitzungsdaten abzurufen / zu setzen.
SCRIPT2
%Vor%TEST FÜR RENNBEDINGUNGEN
Ich dachte, die Daten könnten überschrieben werden, also habe ich einen kurzen Test mit dem folgenden Code gemacht. Jedes Mal, wenn ich das Sitzungsarray aktualisiere, erstelle ich eine neue Sitzungsvariable mit nur den aktualisierten Daten.
%Vor%In einem anderen Skript, als die Website die Aktualisierung abgeschlossen hat, habe ich jede einzelne Sitzung überprüft, um festzustellen, ob sie eingerichtet wurde.
%Vor%TESTERGEBNISSE
Die Array-Informationen, die in jqid fehlen, fehlten auch in der entsprechenden einzelnen Sitzung (die Sitzung mit nur den aktualisierten Daten), so scheint es, dass es kein Problem ist, dass die Daten überschrieben werden. Ich bin mir nicht sicher, ob dies eine Race-Bedingung widerlegt.
Irgendwelche Vorschläge, was Sie denken könnten und wie Sie dies beheben könnten, wären sehr willkommen.
BEARBEITEN
Auch generalisierte Antworten, wie Race-Bedingungen in Joomla verhindert werden können, sind willkommen. Danke
EDIT2
Ich beginne mich zu fragen, ob es kein Problem mit php5.4 und Joomla ist. Ich habe gehört, dass sie nicht gut zusammen spielen und ich kann mich nicht erinnern, dieses Problem zu haben, bevor ich von php5.3 aktualisiert habe. Ich könnte aber auch falsch liegen.
EDIT3
Ich bin am Ende. Ich habe die Website auf einem anderen Server mit PHP 5.3.10 installiert. Ich habe es zehn oder mehr Mal als nicht eingeloggte Benutzer versucht. Es gab keinen Datenverlust. Ich habe mich dann bei Joomla eingeloggt und die Daten gingen fast jedes Mal verloren, wenn ich auf die Seite zugreife. Wenn ich Joomla Sessions nicht benutzen müsste! GRRRrrrrr
EDIT4
Jetzt verzweifelt werden und alles versuchen. JRequest hat nicht funktioniert, obwohl ich es trotzdem benutzen sollte.
Da das Problem häufiger auftritt, wenn ich mich anmelde, habe ich gedacht, dass es sein muss, weil viel mehr Inhalt in der Sitzung gespeichert ist, als wenn der Benutzer ein Gast ist. Jqid ist ein großes Array, und anstatt es ständig zu aktualisieren, habe ich versucht, mehrere kleinere Arrays zu erstellen und sie jeweils zu aktualisieren. Es hatte absolut keine Wirkung. Wahrscheinlich sollte ich das trotzdem tun.
EDIT5B
Beim Versuch, eine behelfsmäßige Lösung zu finden, habe ich versucht zu testen, ob die Sitzung erfolgreich aktualisiert wurde oder nicht (dies wurde im selben Skript ausgeführt, das die Sitzung aktualisiert hat).
Hier ist der Code, den ich verwendet habe, um jstart zu überprüfen.
%Vor%Das Interessante, was ich fand, war, dass jstart die aktualisierten Informationen während der Überprüfung enthielt, aber bei der Fertigstellung fehlte. Ich bin nicht wirklich sicher, was das bedeutet, aber ich denke, wenn wir %code% als Variable behandelt haben, dann wurde die Variable nur für dieses Skript aktualisiert (eine Art wie eine lokale Variable?), Der Datenbankwert für %code% für was auch immer Grund wurde nicht in die Datenbank geschrieben. Später, als dieses Skript erneut ausgelöst wurde, wurde der alte Wert von %code% , der in der Datenbank gespeichert wurde, abgerufen.
Ich habe immer noch keine Ahnung, warum die Sitzung nicht in die Datenbank geschrieben wird.
Tags und Links php session session-variables joomla2.5 race-condition