我希望来自子域/域的一项服务的我的用户可以一次登录到其余的。
这是我的结构:
- /图书馆
- /app1
- 配置
- 模块
- 引导程序
- /app2
- 配置
- 模块
- 引导程序
- /app3
- 配置
- 模块
- 引导程序
- /app1
域
- 应用程序 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 进入时,会话不会将行插入数据库。适配器工作良好,因为我检查了一些测试查询并且它工作正常。
我在 SessionHandler 配置中添加了如下内容:
$config = array(
'db' => Zend_Registry::get('users_db') , //or alone 'main_db'
配置的其余部分是默认的,如参考。
请帮忙。