Joomla 1.5.25刚刚从1.5.23升级,但在保存到会话和持久性方面存在问题,在1.5.23上完美运行,但在使用JSession-> set
时会话数据没有保存到db在joomla上编写自定义应用程序,管理从旧系统导入的用户无法使用joomla用户(或者至少我没有,我没有时间),登录的工作方式如下:
以下是将用户保存到会话
的代码段$session = JFactory::getSession();
$session->set('appUserData', array(
'data' => $USER_OBJECT,
'timestamp' => time(),
'role' => 0,
'permits' => $permits
);, "custom_namespace");
现在,因为我在joomla范围之外这样做,所以我必须使用boostrap
define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define('JPATH_BASE', dirname(dirname(__FILE__)));
require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
一旦我执行了$ session-> set(),如果我在同一个脚本上尝试$ session-> get()它会拉出我刚刚保存的完整资源,但是如果我尝试从另一个上拉取$ session脚本我什么都没得到,这是其他脚本
<?php
error_reporting(E_ALL);
define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define('JPATH_BASE', dirname(dirname(__FILE__)));
require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
$mainframe = JFactory::getApplication('site');
$session = JFactory::getSession();
echo "<pre>";
print_r($_COOKIE);
print_r($session);
print_r($_SESSION);
echo "</pre>";
exit;
这里我只使用默认会话信息获取我的cookie数组和会话数组:
Array
(
[__default] => Array
(
[session.counter] => 3
[session.timer.start] => 1329168055
[session.timer.last] => 1329168057
[session.timer.now] => 1329168062
[session.client.browser] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 FirePHP/0.7.0
)
)
db永远不会使用我新创建的会话变量的内容进行更新,我尝试在写入db会话适配器上执行一些error_logs,这是写入db的那个,我认为问题出在这里(libraries / joomla / session /storage/database.php)第82行:
$session = &JTable::getInstance('session');
if ($session->load($id) == true) { /*...*/} // never entering here
else { /*...*/ } // always here
我尝试将$ id的内容输出到日志中,它确实引用了db上的有效主键id
error_log('SELECT * FROM jos_session WHERE session_id = "' . $id . '"');
返回类似这样的东西 SELECT * FROM jos_session WHERE session_id =“38e6468f35f1994425de3919fa767a3d”,我可以确认它返回一个有效的记录,我试着从1.5.23这里拉旧源,但即使这样也不会它再次运作,有什么想法可能已升级并使其失败?
**更新**
我也试过截断表,事实上我认为更具体的问题是,在某些时候会话失败写入db,因为我有多个连接到正在使用的mysql,JSession数据库Mysql存储引擎用于会话变得困惑,甚至更奇怪的是,在纯1.5.23的环境中,这种混乱不会发生,为每个不同的连接创建资源,我从1.5.23变为1.5.25,我找不到任何东西与DB资源管理或任何对DBO对象的松散引用有关,我想我需要分析每个连接并检查问题所在,Data存在于同一个mysql服务器上,但是在不同的db上
答案 0 :(得分:0)
问题是JSession正在使用数据库存储JsessionStorageDatabase,因为我通过脚本执行连接到多个数据库我的mysql_connect调用并没有真正建立新的连接,他们重用旧的导致脚本失败的时候它没有找不到在JSession的存储适配器想要写入时改变的选定数据库
See mysql_connect documentation here并检查其他用户的this question,这有助于我了解我的问题并找到解决方案