web-dev-qa-db-fra.com

Y a-t-il un problème avec la définition consécutive des variables de session Joomla dans un script php externe?

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

  • stocker les variables dans un tableau et les définir en une fois.
  • créer des espaces de noms différents pour chacune des variables.

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.

5
TryHarder

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.

2
David Fritsch

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');

$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.

1
Jack Ting