无法使用 session_set_save_handler 将SESSION存入数据库,网上说 必须z使用 session_module_name('user')
但是报一下错误,
Warning: session_module_name() [function.session-module-name]: A session is active. You cannot change the session module's ini settings at this time. session数据库

解决方案 »

  1.   

    用 session_set_save_handler 指派了 session 回调函数后,就是 user 模式了
    不需要再执行 session_module_name('user')
    一般指派了回调函数后,都会 session_start()
    这样由于 session 已经启动,你再 session_module_name('user') 也就不行了
      

  2.   

    但是刚才我测试了很多次他根本就没有执行 session_set_save_handler 里面的函授呀,不知道为什么!
    使用session_set_save_handler 的时候还需要配置么?这一块的不是很清楚。
    从网上也查了好多资料 基本上都是一样的,但是在我这里就是不行。这是我的session类
    class session extends ms_model{ 
    var $expiry=3600; 
    var $table='';
    var $sid='';
    var $key = 'session_key';
    //$sid
    function __construct(){
    parent::__construct();
    //$this->sid=$sid;
    session_set_save_handler( 
    array (& $this, "_session_open"), 
    array (& $this, "_session_close"), 
    array (& $this, "_session_read"), 
    array (& $this, "_session_write"), 
    array (& $this, "_session_destroy"), 
    array (& $this, "_session_gc") 
    ); 


    /** 
    * open session handler 

    * @param string $save_path 
    * @param string $session_name 
    * @return boolen 
    */ 
    function _session_open($save_path, $session_name){ 
    $this->table='dbpre_session';
    return TRUE; 


    function _session_close(){ 
    return true; 


    function _session_read($key){ 
    $expiry=time(); 
    $where['session_key']=$key;
    $where['session_expiry']=$expiry;
    $result=parent::find('*',$where);
        return $result[1];


    function _session_write($key,$data){ 
    $expiry_time=time()+$this->expiry;

    $post['session_key']=$key;
    $result=parent::read($key,'session_data');
    if(!$result){
    $key=null;
    }
    $post['session_expiry']=$expiry_time;
    $post['session_data']=$data;
    //$post['sid']=$this->sid;
    $result=parent::save($post,$key,0,0,0);
    return $result;


    function _session_destroy($key=null){ 
    if($key){
    parent::delete($key);
    }else{
    $this->db->from($this->table);
    //$this->db->where('sid',$this->sid);
    $this->db->delete();

    return true;


    function _session_gc($expiry_time){ 
    $expiry_time=time(); 
    $this->db->where('session_expiry',$expiry_time);
    parent::delete();
    return true;

    }
      

  3.   

    1、你实例化这个类了吗?
    2、你都 __construct()(显然是php5了) 了,再 array (& $this, "_session_open") 这样就可能引发一个错误(php 5 > 5.3)
      

  4.   

    实例化了,第二个问题不太明白, array (& $this, "_session_open") 会有什么问题呢?
      

  5.   

    $_ses_=new Session($sid);
    session_start();之后我在 session_set_save_handler() 前面和后面都可以输出值,但是在每个方法里面都不行,就感觉没有执行 session_set_save_handler() 一样,直接跳过了
      

  6.   

    SESSION 是已文件的形式读写的
      

  7.   

    检查一下你的 session.auto_start 的值
      

  8.   

    是一个老板的discuz具体版本我也不清楚了
      

  9.   

    那他自己不是有 session 处理了吗?
      

  10.   

    现在我凌乱了,刚才我在测试另一个SESSION类的时候无意间刷新错了页面,不知到问什么,SESSION成功的写入到数据库了。
      

  11.   

    上面的那个类是有点问题的,现在终于弄好了,谢谢!帮我弄了一下午。
    <?php
    /**
     * Session 数据库存储
     * @author BlueRaven.126.com
     *
     */
    class session extends ms_model{ 
    var $expiry=3600; 
    var $table='';
    var $sid='';
    var $key = 'session_key';
    //$sid
    function __construct($sid){
    parent::__construct();
    $this->sid=$sid; session_set_save_handler( 
    array (& $this, "_session_open"), 
    array (& $this, "_session_close"), 
    array (& $this, "_session_read"), 
    array (& $this, "_session_write"), 
    array (& $this, "_session_destroy"), 
    array (& $this, "_session_gc") 
    );
    //session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc'); } 

    /** 
    * open session handler 

    * @param string $save_path 
    * @param string $session_name 
    * @return boolen 
    */ 
    function _session_open($save_path, $session_name){ 
    $this->table='dbpre_session';
    return TRUE; 


    function _session_close(){
    return false;


    function _session_read($key=null){ 

    //$expiry=time(); 
    if($key){
    $where['session_key']=$key;
    }
    //$where['session_expiry']=$expiry;
    $result=parent::read($key,'session_data');
        return $result?$result['session_data']:'';
    }  function _session_write($key,$data){
    //$now_session=$this->_session_read($key); 
    if($data){
    $post['session_data']=$data;
    }
    $expiry_time=time();
    $post['session_key']=$key;
    $result=parent::read($key,'session_data');
    if(!$result){
    $key=null;
    }
    $post['session_expiry']=$expiry_time;

    $post['sid']=$this->sid;
    $result=parent::save($post,$key,0,0,0);
    return $result;


    function _session_destroy($key=null){ 
    if($key){
    parent::delete(array($key));
    }else{
    $this->db->from($this->table);
    $this->db->where('sid',$this->sid);
    $this->db->delete();

    return true;


    function _session_gc($expiry_time){ 

    $expiry_time=$expiry_time?$expiry_time:time();
    $expiry_time+=$this->expiry;
    $where=array();
    $where['session_expiry']<$expiry_time;
    $where['sid']=$this->sid;
    $this->db->where($where);
    $this->db->delete();
    return true;

    }
            /*a.php*/
            $sid=1;
    $_ses_=new Session($sid);
    /**********************/ session_start();
    $_SESSION['user']='BlueRaven';
    $_SESSION['uid']='007';
    $sessionid=session_id();
    echo $sessionid;
    echo '<pre>';var_dump($_SESSION);
           /*b.php*/        $sid=1;
    $_ses_=new session($sid);
            $sessionid='33ad8a78ade44cd0f412498dde73ac12'; /*这是a.php 生成的SESSION ID*/
    session_id($sessionid);
    session_start(); //echo session_id(); echo '<pre>';
    var_dump($_SESSION);die;