2013-11-14 18 views
0

我正在使用Nicolasff Redis-PHP擴展(https://github.com/nicolasff/phpredis)處理多服務器上的會話。所以我改變了我的會話處理的建議:PHP Redis在所有服務器上銷燬會話

session.save_handler = redis 
session.save_path = "tcp://host1:6379?weight=1" 

在註銷,我破壞了會議,像這樣的一個服務器:

setcookie('session_id', NULL, time() - 4800); 
session_unset(); 
session_destroy(); 
session_write_close(); 
setcookie(session_name(),'',0,'/'); 
session_regenerate_id(true); 
session_destroy(); 

但問題是會話只有摧毀一個服務器和而不是其他。我如何確保會話在所有服務器上銷燬?

+0

可能的解決方案是將會話存儲在單個RedisStore實例中。因此,在一臺服務器上銷燬會話也會破壞其他人。 – bsnrijal

回答

0

注意在參數「權重」的phpredis說明:

主機的重量與他人比較使用,以自定義在多個主機會話分配。如果主機A的重量是主機B的兩倍,則會獲得兩倍的會話數量。在本例中,host1存儲所有會話的20%(1 /(1 + 2 + 2)),而host2和host3每個存儲40%(2/1 + 2 + 2)。目標主機在會話開始時一勞永逸地確定,並且不會改變。默認權重爲1.

這意味着phpredis會根據會話ID選擇目標服務器,並在每次更改它時進行選擇。在您的代碼:

//Both of next lines delete session key in redis stotage. 
    //Read from 411 line of redis_session.c 
    session_unset(); 
    session_destroy(); 

    //delete current session (due to $delete_old_session = true) and start new 
    //session i.e. select new server and write data. 
    session_regenerate_id(true); 

換句話說 - 你不需要,如果你使用的是N臺服務器來存儲與phpredis radis會做什麼特別。如果您不需要它,只需使用session_unsetsession_destroy即可刪除會話,如果需要已啓動會話的新會話ID,請致電session_regenerate_id