2014-01-06 71 views
1

我在使用memcached處理會話時收到了一個非常奇怪的行爲。 看起來像我的用戶正在分享會議,因爲(目前)沒有理由。與memcached的PHP會話。 session_destroy()不會刪除內存緩存條目

使用案例:

我登錄,獲得 'XXX' 的PHPSESSID。無緣無故,另一臺計算機的另一位用戶得到的是相同的PHPSESSID,當然還有我的個人資料和所有其他會話數據。

從你的頭頂開始,session_start()發出已創建的SESSID的原因是什麼?

經過數小時的調試,我發現唯一'奇怪'的事情'註銷'行動並不會刪除該會話的memcached條目。

// Resume session. 
session_start(); 

// Unset all session data. 
$_SESSION[V::$SESS_NAME] = array(); 

// Kill session cookie. 
if(ini_get('session.use_cookies')) 
{ 
    $params = session_get_cookie_params(); 

    // Send this cookie to the past. Time travel - possible! 
    setcookie(session_name(), '', time() - 42000, $params['path'], $params['domain'], $params['secure'], $params['httponly']); 
} 

// Destroy the session. 
session_destroy(); 

Does anyone else experienced similar behaviour while working with PHP memcached session?

Thanks, Mike

回答

0

memcached and PHP's session functions (like session_destroy())不相關。 session_destroy()只結束一個PHP會話;它與memcached無關。如果您還想刪除memcached條目,則需要明確地執行此操作。

+0

Hm ...因此,session_start()會將memc.sess.key.SESSIONID添加到memcached中,寫入$ _SESSION會將值寫入memc.sess.key.SESSIONID,但session_destroy()不會刪除memc.sess memcached中的.key.SESSIONID?如果這是真的,你知道這是從經驗還是有鏈接,我可以讀一讀? – rock3t

2

經過一些調試,我確實發現了問題,這是由Varnish造成的。顯然頁面正在緩存與標題。

邊緣情況:

  • 用戶A涉及到的網站,要求新鮮(無餅乾),得到了漆小姐和獲得的一個會話cookie。登錄。
  • 用戶B來到網站,請求新鮮(沒有餅乾),得到清漆HIT。清漆發送以前兌現頁面的標題(帶有Set-Cookie)。用戶B通過用戶A的session_id獲取會話cookie。用戶B自動登錄到用戶A配置文件。

對不起,沒有指出,該堆棧有Varnish運行。在進入調試的深處之前,並沒有意識到自己。

+0

您是如何最終解決這個問題的? – userfuser

+0

@userfuser set-cookie頭不會進入緩存,當HIT不回到響應時。 – rock3t

+0

在我的情況下,Varnish也是怪罪。但對於我來說,Varnish顯然也緩存了煮過的頁面,因爲在瀏覽器中,PHP會話在那裏暫時存在,然後消失了,稍後再回來。禁用Varnish後,問題就消失了。 – userfuser