session_write_close()和再次调用session_start()之间的PHP会话丢失

时间:2016-02-27 15:52:30

标签: php codeigniter session redis

问题已解决,与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调用提供。

我必须编写并关闭会话,因为我有大量查询(原来在两个会话查询之间有更多的东西)。如何在保留数据的同时关闭会话(释放锁定)?

0 个答案:

没有答案