繁体   English   中英

PHP - 在数据库中存储会话

[英]PHP - Storing Session in a Database

我正在设置一个带有负载均衡器的 EC2 集群。 我有单独的数据库服务器,上面运行着 mysql。 我有 3 个 web 服务器在运行,主要是为了高可用性,当然它似乎是循环负载平衡,所以你访问的每个页面都会得到一个不同的服务器,这会丢失你的会话。

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

session_set_save_handler('_open',
                         '_close',
                         '_read',
                         '_write',
                         '_destroy',
                         '_clean');

但是当我登录或网站上的任何内容时,我检查了表格,但没有写入任何内容。 我不确定是否需要更改 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');

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

在你没有真正做任何会话的函数中(比如“_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
}

这确实不是您问题的答案,但是如果您需要真正的高可用性,我可以建议将会话存储在 mysql 中不是一个好方法。

更好的做法:将会话放在内存缓存中。 Memcache 服务器很容易安装。 Memcache 客户端安装简单,php 支持在 memcache 中存储 session,无需编程!!! Memcache 将数据存储在内存中,而不是磁盘中,而且速度更快。

在这里您可以查看关于此的好帖子: http : //kevin.vanzonneveld.net/techblog/article/enhance_php_session_management/

运气!!

为什么你不能使用cookies? 只需让脚本检查 cookie 是否存在,然后从那里读取值。 除非安全是一个问题.. 我建议在会话上使用 cookie 以获得廉价的可扩展性..在数据库中写入会话不会很好,并且可能会导致无缘无故地运行昂贵的查询。

会话的最佳数据库将是 Redis 或 MonogDB 之类的数据库,而不是 MySQL 和 memcached。 您可以根据获得的流量使用 memcached,但 Redis 或 MongoDB 是更具可扩展性的数据库。 此外,由于您使用的是 EC2,您可能需要查看 Amazon SimpleDB。 它是一个键/值存储,因此它应该非常适合会话。

我个人会使用 MongoDB 运行,因为您不仅可以将会话存储在那里,而且您可以从 MySQL 中获取您拥有的内容并将其缓存在那里,以及将其他数据存储在 Mongo 中......或者只是考虑转换您网站的数据库,因为你可能会爱上 MongoDB =)

您还可以在 Application Cookies 下查看 HAProxy 的设置。 这也可能对你有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM