it-swarm-es.tech

¿Hay algo malo en configurar las variables de sesión de Joomla consecutivamente en un script php externo?

Estoy configurando múltiples variables de sesión en un script PHP que es externo a Joomla.

Las variables se configuran consecutivamente utilizando el siguiente código.

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

En otro script, obtengo las variables de sesión

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

El problema que veo es que el valor de firstvalue ocasionalmente desaparece. No estoy seguro si esto le sucede a las otras variables todavía. Por lo que he leído, es posible que Joomla no esté bloqueando la sesión. Lo que creo que eso significa es que Joomla intenta establecer el primer valor, pero antes de que se guarde, se sobrescribe con otra variable. ¿Suena bien?

Si mi comprensión de la situación es correcta, he encontrado algunas soluciones. Si tienes algunos mejores, me encantaría escucharlos :)

Yo podría

  • almacenar las variables en una matriz y configurarlas de una vez.
  • crear diferentes espacios de nombres para cada una de las variables.

En resumen,

Me gustaría saber si configurar variables de sesión de Joomla consecutivamente en un script externo a Joomla podría causar la pérdida de algunos valores. Si eso es poco probable, agradecería sugerencias sobre qué podría estar causando la pérdida de datos y sugerencias sobre cómo resolver el problema.

5
TryHarder

He tenido problemas con esto cuando la base de datos se usa como controlador de sesión. Por lo que puedo reunir, los datos de la sesión no se escriben en la base de datos hasta que el script haya finalizado. Esto significa que si el segundo script comienza a ejecutarse antes de que finalice el primero, cargaría los datos de la sesión sin los nuevos valores, ya que aún no se ha escrito en la base de datos.

Tuve suerte con solo cambiar el controlador de sesión a file en lugar de database y tuve que bloquear el archivo para que el segundo script no se ejecute hasta que el primero haya terminado y guardado su valor. Esto probablemente se deba a que no hay una forma tan buena de bloquear la fila de la tabla individual como un archivo.

2
David Fritsch

OK, el problema es que tenemos que usar la misma sesión.

Para hacer eso. Tuvimos que llamar a $session->getId() para obtener el actual seeeion_id Y luego enviarlo al lado del cliente, cuando creamos la sesión y guardamos los datos.

Luego, el lado del cliente debe pasar el session_id Cuando quieran recuperar los datos de la sesión, y nosotros pasamos el seeeion_id Como uno de los parámetros de JFactory::getSession().

La JFactory::getSession() puede tomar una matriz como parámetro. Para especificar session_id Usamos id como nombre. entonces los códigos son

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

donde $input_msg->session_id es el session_id que recuperas de la entrada del usuario.

Otra cuestión importante es que si queremos destroy() la sesión, justo después de recuperar la sesión con $session = JFactory::getSession($options). Tenemos que activar la sesión llamando a $session->start(), luego llamar a $session->destroy() puede ser exitoso, de lo contrario obtendremos un mensaje de error.

Por cierto, puede encontrar sus sesiones en la tabla #__session Un registro por sesión.

1
Jack Ting