ti-enxame.com

Há algo de errado em definir variáveis ​​de sessão do Joomla consecutivamente em um script php externo?

Estou definindo várias variáveis ​​de sessão em um script PHP externo ao Joomla.

As variáveis ​​são definidas consecutivamente usando o seguinte 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); 

Em outro script, recebo as variáveis ​​de sessão

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

O problema que estou vendo é que o valor do firstvalue ocasionalmente desaparece. Não tenho certeza se isso acontece com as outras variáveis ​​ainda. Pelo que li, é possível que o Joomla não esteja bloqueando a sessão. O que eu acho que isso significa é que o Joomla tenta definir o primeiro valor, mas antes de ser salvo, ele é substituído por outra variável. Isso soa certo?

Se meu entendimento da situação estiver correto, eu tenho algumas soluções. Se você tiver alguns melhores, eu adoraria ouvi-los :)

Eu poderia

  • armazene as variáveis ​​em uma matriz e defina-as de uma só vez.
  • crie namespaces diferentes para cada uma das variáveis.

Em suma,

Gostaria de saber se definir variáveis ​​de sessão do Joomla consecutivamente em um script externo ao Joomla poderia causar a perda de alguns valores. Se isso for improvável, agradeceria sugestões sobre o que poderia estar causando a perda de dados e sugestões sobre como resolver o problema.

5
TryHarder

Eu tive problemas com isso quando o banco de dados é usado como o manipulador de sessões. Pelo que pude reunir, os dados da sessão não são gravados no banco de dados até que o script seja finalizado. Isso significa que, se o segundo script começar a ser executado antes do primeiro término, os dados da sessão serão carregados sem os novos valores, pois ainda não foram gravados no banco de dados.

Tive alguma sorte em mudar o manipulador de sessão para file em vez de database e tive que bloquear o arquivo para que o segundo script não fosse executado até que o primeiro terminasse e salvasse seu arquivo valor. Provavelmente, isso ocorre porque não há uma maneira tão boa de bloquear a linha da tabela individual como existe um arquivo.

2
David Fritsch

OK, o problema é que conseguimos usar a mesma sessão.

A fim de fazer isso. Tivemos que chamar $session->getId() para atualizar seeeion_id E enviá-lo para o lado do cliente, quando criamos a sessão e salvamos os dados.

Em seguida, o lado do cliente deve devolver o session_id Quando quiser recuperar os dados da sessão e passamos o seeeion_id Como um dos parâmetros de JFactory::getSession().

A JFactory::getSession() pode usar uma matriz como parâmetro. Para especificar o session_id, Usamos id como o nome. então os códigos são

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

onde $input_msg->session_id é o session_id que você recupera da entrada do usuário.

Outra questão importante é que, se queremos destroy() a sessão, logo após recuperarmos a sessão novamente por $session = JFactory::getSession($options). Temos que ativar a sessão chamando $session->start(), e chamar $session->destroy() pode ser um sucesso, caso contrário, receberemos uma mensagem de falha.

A propósito, você pode encontrar suas sessões na tabela #__session Um registro por sessão.

1
Jack Ting