2011-03-13 43 views
5

嘿傢伙存儲會話,我設置了一個負載平衡器EC2集羣。我有單獨的數據庫服務器上運行的MySQL。我有3個Web服務器正在運行,主要是爲了獲得高可用性,當然它的循環負載均衡似乎是這樣,所以每個頁面都會有一個不同的服務器,這會讓您的會話失去。PHP - 在一個數據庫

我想安裝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'); 
+0

你可以發佈有問題的功能嗎?他們是在一個班,他們是獨立的職能,等等... – 2011-03-13 18:43:57

+0

剛剛編輯帖子,謝謝:) – 2011-03-13 18:48:32

回答

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 
} 
+0

我剛剛編碼。仍然不工作:/ – 2011-03-13 19:00:46

+0

我不認爲你需要返回'_write'和'_clean'的查詢結果對象。嘗試將它們替換爲返回true。 (並保留'_destroy'的方式) – 2011-03-13 19:02:59

+0

仍然沒有任何東西:'( – 2011-03-13 19:05:20

0

真的這不是回答你的問題,但如果你真的需要高可用性,我可以建議存放在MySQL會議不是一個好方法。

一個更好的做法:把你的會話內存緩存中。 Memcache服務器很容易安裝。 Memcache客戶端很容易安裝,php支持在memcache中存儲會話而無需編程! Memcache將數據存儲在內存中,而不是存儲在磁盤中,速度更快。

在這裏,您可以看到好的帖子一下:http://kevin.vanzonneveld.net/techblog/article/enhance_php_session_management/

LUCK !!

+1

-1:這是完全不可擴展的。在高流量的網站上,要麼你會開始丟失會議因爲你會達到memcached配置的限制,或者隨着你的用戶基數的增加,你將不得不購買更多的RAM。RAM不便宜。另一方面,硬盤驅動器是... – 2011-03-13 19:11:43

+0

這是EC2我們正在談論。如果OP在其主要實例中擔心內存,那麼微小的預算實例足夠強大,可以託管*專用的* memcached實例。內存在這個特定的場景中並不是真正的問題。 – Charles 2011-03-13 19:49:21

+0

Memcache不是會話數據庫的替代品。把它作爲性能層添加是非常好的,但是你仍然應該寫入一個更持久的存儲,然後讀取緩存未命中的商店。 – davidjbullock 2012-05-01 05:05:08

0

你怎麼可以不使用cookies?只要腳本檢查cookie是否存在,然後從那裏讀取值。除非安全是一個問題..我建議在餅乾屆..Writing的數據庫會不會好幾屆便宜的可擴展性,並可能會導致昂貴的查詢是無緣無故跑。

0

的會話最好的數據庫將是類似的Redis或MonogDB而不是MySQL和Memcached的不是。你可以使用memcached的取決於你如何獲取的流量,但Redis的或MongoDB是一個更加可擴展的數據庫。另外,由於您使用的是EC2,您可能需要查看Amazon SimpleDB。這是一個關鍵/價值商店,因此它應該適合會議。

我個人使用MongoDB運行,因爲您不僅可以將您的會話存儲在那裏,還可以從MySQL獲取並緩存它,以及在Mongo中存儲其他數據......或者只是想一想有關轉換您的網站的數據庫完全是因爲你可能會愛上的MongoDB =)

您還可以查看到HAProxy的下應用程序Cookie設置。這也可以幫助你。

相關問題