【问题标题】:Zend Session: Common session at multi appsZend Session:多应用程序的通用会话
【发布时间】:2011-06-25 09:40:22
【问题描述】:

我希望我的用户从子域/域的一项服务可以一次登录到其余的。

这是我的结构:

  • /库
    • /app1
      • 配置
      • 模块
      • 引导
    • /app2
      • 配置
      • 模块
      • 引导
    • /app3
      • 配置
      • 模块
      • 引导

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

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


试验一: 我尝试将 session_data 从旧 ID 简单更新为新 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 进入时,会话不会将行插入数据库。 适配器工作良好,因为我检查了一些测试查询并且它工作正常。

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

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

配置的其余部分是默认的,如参考。

请帮忙。

【问题讨论】:

    标签: zend-framework session zend-session


    【解决方案1】:

    您不需要从 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 =
    

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

    【讨论】:

    • 我无权访问 php_ini,我可以通过 ini_set 执行此操作吗?
    【解决方案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');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2012-03-02
      • 2021-11-19
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多