Zend Session:多应用程序的常见会话

时间:2011-06-25 09:40:23

标签: zend-framework session zend-session

我希望来自子域/域的一个服务的用户可以立即登录其余的服务。

这是我的结构:

  • /库
    • / APP1
      • 配置
      • 模块
      • 自举
    • / APP2
      • 配置
      • 模块
      • 自举
    • / APP3
      • 配置
      • 模块
      • 自举

  • App 1:example.com
  • 应用2:app2.example.com
  • 应用3:app3.example.com

所有人都在使用一个数据库进行帐户,会话等。
当有人输入其中一个应用程序并将其ip保存到数据库时,我试图让Session_Db_Adpater工作。
然后,当他输入另一个脚本(在另一个脚本中)时,应该检查他是否有表记录,如果他有,脚本应该进行活动会话或者如果他没有创建新的脚本。


试验1: 我试图简单地将session_data更新为旧的id,但session_data拒绝更新,尽管$ db-> update()返回true。

试验2 我关闭了Session_SaveHandler_DbTable并尝试了这个,因为最终它们位于同一个域中:

  Zend_Session::setOptions(array('cookie_domain' => '.example.com'));
    Zend_Session::start();

仍然没有。

试验3 我使用了Zend_Session :: setId();

    $db = Zend_Registry::get('users_db');    
    $test = $db->select()->from('session')->where('ip = ?', $_SERVER['REMOTE_ADDR']);
    $row = $db->fetchRow($test);
    if($row) {            
        Zend_Session::setId($row['session_id']);
    } else {
        Zend_Session::start();
        $db->update('session', array('ip'=>$_SERVER['REMOTE_ADDR']), 'session_id = "'. Zend_Session::getId() .'"');
    }

它工作2-5分钟,然后抛出此错误:会话已经启动。必须先设置会话ID。

我注意到当我输入例如app3.example.com时,session不会将行插入数据库。 适配器工作正常,因为我检查了一些测试查询,它的工作原理。

我在SessionHandler配置中输入了这样的内容:

    $config = array(
        'db' => Zend_Registry::get('users_db') ,  //or alone 'main_db' 

配置的其余部分默认为参考。

请帮助。

2 个答案:

答案 0 :(得分:2)

你不需要从Zend设置任何东西。只需在php.ini文件中设置以下内容

即可
; The path for which the cookie is valid.
session.cookie_path = /

; The domain for which the cookie is valid.
session.cookie_domain =

现在,子域中的所有应用程序都可以访问从主应用程序创建的相同SESSION ID,反之亦然。

答案 1 :(得分:2)

        if(isset($_COOKIE['session_id']))
            session_id($_COOKIE['session_id']);
        Zend_Session::start(); //or session_start();
        if(!isset($_COOKIE['session_id']))
            setcookie('session_id', session_id(), 0, '/', '.yourdomain.com');