问题已解决,与Codeigniter有关,所以我没有写回答。见评论。
我运行以下代码:
$this->session->set_userdata('username', $post['username']);
$this->session->set_userdata('uid', $result->row()->uid);
$this->session->set_userdata('priviledge', $result->row()->priviledge);
var_dump(session_id(), $_SESSION); echo '<br />';
session_write_close();
session_start();
var_dump(session_id(), $_SESSION); echo '<br />';
它位于Codeigniter下,set_userdata
定义如下:
/**
* Set userdata
*
* Legacy CI_Session compatibility method
*
* @param mixed $data Session data key or an associative array
* @param mixed $value Value to store
* @return void
*/
public function set_userdata($data, $value = NULL)
{
if (is_array($data))
{
foreach ($data as $key => &$value)
{
$_SESSION[$key] = $value;
}
return;
}
$_SESSION[$data] = $value;
}
这相当于使用PHP内置会话。
输出:
string(40) "a6effee6d73c97c29219c7882c3e3b0459755b3b" array(3) { ["username"]=> string(8) "beantan1" ["uid"]=> string(2) "76" ["priviledge"]=> string(4) "user" }
string(40) "a6effee6d73c97c29219c7882c3e3b0459755b3b" array(0) { }
显然,会话丢失了。 (“特权”上有一个小错字。只需忽略它)
我使用内置的redis驱动程序,并获得redis日志,如下(部分):
$3
SET
$51
ci_session:a6effee6d73c97c29219c7882c3e3b0459755b3b
$59
username|s:8:"beantan1";uid|s:2:"76";priviledge|s:4:"user";
*3
$9
PEXPIREAT
$51
ci_session:a6effee6d73c97c29219c7882c3e3b0459755b3b
$13
1456590215697
*3
$3
SET
$51
ci_session:a6effee6d73c97c29219c7882c3e3b0459755b3b
$78
show_category|s:1:"0";problems_per_page|s:2:"20";submission_per_page|s: 2:"20";
*3
最后一次SET查询由另一个set_userdata
调用提供。
我必须编写并关闭会话,因为我有大量查询(原来在两个会话查询之间有更多的东西)。如何在保留数据的同时关闭会话(释放锁定)?