PHP - 在数据库中存储会话

Qui*_*ike 5 php mysql apache load-balancing amazon-ec2

嘿伙计们,我正在建立一个带负载均衡器的EC2集群.我有单独的DB服务器,上面运行了mysql.我有3个web服务器正在运行,主要是为了实现高可用性,当然它似乎是循环负载平衡,所以你去的每个页面都会得到一个不同的服务器,会丢失你的会话.

我正在尝试设置PHP以将其存储在数据库中.我已经设置了一个表,并设置了所有功能(打开,关闭等).我已经设定:

session_set_save_handler('_open',
                         '_close',
                         '_read',
                         '_write',
                         '_destroy',
                         '_clean');
Run Code Online (Sandbox Code Playgroud)

但是当我登录或网站上的任何内容时,我检查表格并没有写任何内容.我不确定我是否需要在php.ini文件中更改内容.如果是这样,改变的价值是什么?

谢谢!!

编辑:功能:

function _open(){    
    global $con;
    connect();
} 

function _close(){  
    global $con;  
    //mysql_close();
}

function _read($id){    
    global $con;    
    $id = mysql_real_escape_string($id);     
    $sql = "SELECT data FROM sessions WHERE id = '$id'";     
    if ($result = mysql_query($sql, $con)) {        
        if (mysql_num_rows($result)) {            
            $record = mysql_fetch_assoc($result);             
            return $record['data'];        
        }    
    }     
    return '';
}

function _write($id, $data)
{
    global $con;

    $access = time();

    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);

    $sql = "REPLACE
            INTO    sessions
            VALUES  ('$id', '$access', '$data')";

    return mysql_query($sql, $con);
}

function _destroy($id)
{
   global $con;
    $id = mysql_real_escape_string($id);
    $sql = "DELETE
            FROM   sessions
            WHERE  id = '$id'";
    return mysql_query($sql, $con);
}

function _clean($max)
{
    global $con;

    $old = time() - $max;
    $old = mysql_real_escape_string($old);

    $sql = "DELETE
            FROM   sessions
            WHERE  access < '$old'";

    return mysql_query($sql, $con);
}

session_set_save_handler('_open',
                         '_close',
                         '_read',
                         '_write',
                         '_destroy',
                         '_clean');
Run Code Online (Sandbox Code Playgroud)

Ste*_*her 1

您正在使用的函数将中断正常的会话函数并插入您的代码以执行操作,然后继续执行其他内部函数。

在你没有真正做任何会话方面的事情的函数中(比如“_open”和“_close”),你需要返回一些东西来执行命令,否则它就会在那里死掉。

例子:

function _open($save_path, $session_name){    
    global $con;
    connect();

    return true; //Do nothing but carry on
} 

function _close(){  
    global $con;  
    //mysql_close();

    return true; //Do nothing but carry on
}
Run Code Online (Sandbox Code Playgroud)