Joomla 1.5.25 JSession设置在从1.5.23升级后不关闭写入db

时间:2012-02-13 21:41:22

标签: php mysql session joomla joomla1.5

Joomla 1.5.25刚刚从1.5.23升级,但在保存到会话和持久性方面存在问题,在1.5.23上完美运行,但在使用JSession-> set

时会话数据没有保存到db

在joomla上编写自定义应用程序,管理从旧系统导入的用户无法使用joomla用户(或者至少我没有,我没有时间),登录的工作方式如下:

  1. 用户发布电子邮件传递
  2. app检查用户是否存在
  3. 如果用户存在,我将用户对象保存到会话
  4. 将用户重定向到资源
  5. 以下是将用户保存到会话

    的代码段
    $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上

1 个答案:

答案 0 :(得分:0)

问题是JSession正在使用数据库存储JsessionStorageDatabase,因为我通过脚本执行连接到多个数据库我的mysql_connect调用并没有真正建立新的连接,他们重用旧的导致脚本失败的时候它没有找不到在JSession的存储适配器想要写入时改变的选定数据库

See mysql_connect documentation here并检查其他用户的this question,这有助于我了解我的问题并找到解决方案