Je configure plusieurs variables de session dans un script PHP externe à Joomla.
Les variables sont définies consécutivement à l'aide du code suivant.
//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);
Dans un autre script, j'obtiens ensuite les variables de session
$session = JFactory::getSession();
$firstvalue = $session->get('firstvalue');
//etc etc
Le problème que je vois est que la valeur de firstvalue occasionnellement est manquante. Je ne sais pas encore si cela se produit pour les autres variables. D'après ce que j'ai lu, il est possible que Joomla ne verrouille pas la session. Ce que je pense que cela signifie, c’est que Joomla essaie de définir la première valeur, mais avant qu’il ne soit enregistré, il est écrasé par une autre variable. Est-ce que ça sonne bien?
Si je comprends bien la situation, j'ai proposé quelques solutions. Si vous en avez de meilleures, j'aimerais les entendre :)
Je pourrais
En résumé,
J'aimerais savoir si le fait de définir les variables de session Joomla de manière consécutive dans un script externe à Joomla peut entraîner la perte de certaines valeurs. Si cela est peu probable, j'apprécierais des suggestions sur ce qui pourrait causer la perte de données et des suggestions sur la façon de résoudre le problème.
J'ai eu des problèmes avec cela lorsque la base de données est utilisée comme gestionnaire de session. D'après ce que je peux rassembler, les données de session ne sont pas écrites dans la base de données tant que le script n'est pas terminé. Cela signifie que si le second script commence à s'exécuter avant la fin du premier, il chargerait les données de la session sans les nouvelles valeurs car il n'a pas encore été écrit dans la base de données.
J'ai eu un peu de chance en changeant simplement le gestionnaire de session en file
au lieu de database
, ce qui a pour effet de verrouiller le fichier afin que le second script ne s'exécute pas tant que le premier ne soit pas terminé et ne soit sauvegardé. valeur. Ceci est probablement dû au fait qu'il n'y a pas un moyen aussi efficace de verrouiller la ligne individuelle d'un tableau qu'un fichier.
OK, le problème est que nous avons utilisé la même session.
Pour pouvoir faire ça. Nous avons dû appeler $session->getId()
pour obtenir le seeeion_id
Actuel, puis l'envoyer au côté client, lorsque nous créons la session et sauvegardons les données.
Ensuite, le client doit renvoyer le session_id
Lorsqu'il souhaite récupérer les données de la session, puis nous passons le seeeion_id
Comme l'un des paramètres de JFactory::getSession()
.
La JFactory::getSession()
peut prendre un tableau en tant que paramètre. Pour spécifier le session_id
, Nous utilisons id
comme nom. donc les codes sont
$options = array(
"id" => $input_msg->session_id
);
$session = JFactory::getSession($options);
$firstvalue = $session->get('firstvalue');
où $input_msg->session_id
est le session_id
que vous récupérez à partir de la saisie de l'utilisateur.
Un autre problème important est que si nous voulons destroy()
la session, immédiatement après la récupération de la session par $session = JFactory::getSession($options)
. Nous devons activer la session en appelant $session->start()
, puis appeler $session->destroy()
peut être un succès, sinon nous aurons un message d'échec.
En passant, vous pouvez trouver vos sessions sur la table #__session
, Un enregistrement par session.