it-swarm.com.de

Stimmt etwas nicht, wenn Joomla-Sitzungsvariablen nacheinander in einem externen PHP-Skript gesetzt werden?

Ich setze mehrere Sitzungsvariablen in einem PHP Skript außerhalb von Joomla.

Die Variablen werden nacheinander mit dem folgenden Code festgelegt.

//Access Joomla
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__));
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$app = JFactory::getApplication('site');
$app->initialise();

//Store values in Joomla Session
$session = JFactory::getSession();
$session->set('firstvalue', $firstvalue);
$session->set('secondvalue', $secondvalue);   
$session->set('thirdvalue', $thirdvalue);
$session->set('fourthvalue', $fourthvalue); 

In einem anderen Skript bekomme ich dann die Sitzungsvariablen

$session = JFactory::getSession();
$firstvalue = $session->get('firstvalue');
//etc etc

Das Problem, das ich sehe, ist, dass der Wert für firstvalue gelegentlich fehlt. Ich bin mir nicht sicher, ob dies bei den anderen Variablen noch passiert. Nach dem, was ich gelesen habe, ist es möglich, dass Joomla die Sitzung nicht sperrt. Was ich denke, das bedeutet, dass Joomla versucht, den ersten Wert zu setzen, aber bevor er gespeichert wird, wird er von einer anderen Variablen überschrieben. Klingt das richtig?

Wenn ich die Situation richtig verstanden habe, habe ich ein paar Lösungen gefunden. Wenn du bessere hast, würde ich sie gerne hören :)

Ich könnte

  • speichern Sie die Variablen in einem Array und setzen Sie sie auf einmal.
  • erstellen Sie unterschiedliche Namespaces für jede der Variablen.

Zusammenfassend,

Ich würde gerne wissen, ob das fortlaufende Setzen von Joomla-Sitzungsvariablen in einem Skript außerhalb von Joomla dazu führen kann, dass einige Werte verloren gehen. Wenn dies unwahrscheinlich ist, würde ich mich über Vorschläge freuen, was den Datenverlust verursachen könnte, und Vorschläge zur Lösung des Problems.

5
TryHarder

Ich hatte Probleme damit, wenn die Datenbank als Sitzungshandler verwendet wird. Soweit ich das beurteilen kann, werden die Sitzungsdaten erst nach Beendigung des Skripts in die Datenbank geschrieben. Das heißt, wenn das zweite Skript ausgeführt wird, bevor das erste beendet ist, werden die Sitzungsdaten ohne die neuen Werte geladen, da sie noch nicht in die Datenbank geschrieben wurden.

Ich hatte etwas Glück, indem ich einfach den Session-Handler auf file anstatt auf database umstellte und die Datei so sperrte, dass das zweite Skript nicht ausgeführt wurde, bis das erste beendet und gespeichert war Wert. Dies liegt wahrscheinlich daran, dass es keine so gute Möglichkeit gibt, die einzelne Tabellenzeile zu sperren, wie es eine Datei gibt.

2
David Fritsch

OK, das Problem ist, dass wir dieselbe Sitzung verwenden müssen.

Um das zu tun. Wir mussten $session->getId() aufrufen, um den aktuellen seeeion_id Zu erhalten, und ihn dann an den Client senden, wenn wir die Sitzung erstellen und die Daten speichern.

Dann sollte die Clientseite den session_id Zurückgeben, wenn sie die Sitzungsdaten zurückholen möchten, und wir übergeben den seeeion_id Als einen der Parameter von JFactory::getSession().

Die JFactory::getSession() kann ein Array als Parameter annehmen. Um den session_id Anzugeben, verwenden wir id als Namen. Also die Codes sind

$options = array(
    "id" => $input_msg->session_id
);
$session = JFactory::getSession($options);
$firstvalue = $session->get('firstvalue');

dabei ist der $input_msg->session_id der session_id, den Sie von der Benutzereingabe abrufen.

Ein weiteres wichtiges Problem ist, dass, wenn wir die Sitzung destroy() möchten, sofort nach dem Abrufen der Sitzung durch $session = JFactory::getSession($options). Wir müssen die Sitzung aktivieren, indem wir $session->start() aufrufen, dann kann der Aufruf von $session->destroy() erfolgreich sein, andernfalls erhalten wir eine Fehlermeldung.

Übrigens, Sie finden Ihre Sitzungen in der Tabelle #__session In einem Datensatz pro Sitzung.

1
Jack Ting