簡體   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