[英]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.