Wie verhindert man Race-Bedingungen beim Schreiben / Lesen von Joomla-Session-Variablen aus einem externen PHP-Skript?

9

FRAGEN

  • Ist der zeitweilige Verlust von Sitzungsdaten wahrscheinlich auf eine Race Condition zurückzuführen? Wenn nein, was ist wahrscheinlich das Problem?
  • Wie kann ich Race Conditions beim Schreiben / Lesen von Joomla verhindern? Sitzungsvariablen von einem externen PHP-Skript?

DETAILS

Ich benutze

  • Joomla 2.5
  • PHP 5.4.3
  • Apache 2.2.22
  • mysql 5.5.24
  • wampserver 2 auf localhost.
  • Mein Skript ist extern zu Joomla.
  • (cometchat Version 3.0.1)

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.

    
moomoochoo 28.12.2012, 01:17
quelle

2 Antworten

2

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 aufgetreten

Da 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

benutzt

cometchat 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%     
moomoochoo 28.12.2012, 11:00
quelle
3
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ qstnhdr ___ Wie verhindert man Race-Bedingungen beim Schreiben / Lesen von Joomla-Session-Variablen aus einem externen PHP-Skript? ___ tag123session ___ Eine Sitzung bezieht sich auf alle Anforderungen, die ein einzelner Client an einen Server stellt. Eine Sitzung ist spezifisch für den Benutzer und für jeden Benutzer wird eine neue Sitzung erstellt, um alle Anfragen von diesem Benutzer zu verfolgen. ___ tag123sessionvariables ___ Sitzungsvariable ist eine Informationseinheit innerhalb eines Sitzungszustands. Es wird während des Besuchs eines Benutzers innerhalb der Beschränkungen des zustandslosen HTTP-Protokolls beibehalten. ___ tag123joomla25 ___ Joomla ist ein Open-Source-CMS, das in PHP geschrieben ist und von einem MVC-orientierten Framework unterstützt wird. Bitte beachten Sie, dass Version 2.5 keine unterstützte Version mehr ist und ein Upgrade auf die neueste Version dringend empfohlen wird. Joomla Fragen zu Programmierung und Administration werden am besten auf http://joomla.stackexchange.com gestellt ___ answer13216731 ​​___

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.

    
___ answer14063306 ___

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 aufgetreten

Da 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

benutzt

cometchat 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%     
___ qstntxt ___

FRAGEN

  • Ist der zeitweilige Verlust von Sitzungsdaten wahrscheinlich auf eine Race Condition zurückzuführen? Wenn nein, was ist wahrscheinlich das Problem?
  • Wie kann ich Race Conditions beim Schreiben / Lesen von Joomla verhindern? Sitzungsvariablen von einem externen PHP-Skript?

DETAILS

Ich benutze

  • Joomla 2.5
  • PHP 5.4.3
  • Apache 2.2.22
  • mysql 5.5.24
  • wampserver 2 auf localhost.
  • Mein Skript ist extern zu Joomla.
  • (cometchat Version 3.0.1)

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.

    
___ tag123racecondition ___ Eine Race-Bedingung ist, wenn mehrere Threads / Prozesse / Clients alle eine Ressource verwenden, ohne die Sperren richtig zu verwenden. ___
TryHarder 04.11.2012 06:59
quelle