2011-12-23 83 views
7

我對PHP的會話數的幾個問題:關於PHP會議幾個問題

  1. 由於爲session.gc_maxlifetime的默認值是24 分鐘那麼這意味着任何會話文件沒有被修改 24分鐘將被刪除,會話將自動失效。

  2. 如果我在代碼中使用session_destroy(),會話將被取消設置,但會話文件本身不會被刪除,直到上次修改後的24分鐘內纔會被刪除。

  3. 延長會話使用壽命(超過24分鐘)的唯一方法是將session.gc_maxlifetime擴展爲更大的值。

所有這些都正確嗎?或者我有什麼不對嗎?

此外,如果我將我的會話存儲在數據庫中(使用session_set_save_handler()),所有這些規則是否適用於它們?

回答

5
  1. 差不多。文件(會話)不會被立即刪除,這是由session.gc_probability確定的,session.gc_divisor確定的。

  2. 否,會話將過期,但在之前的點表示確定會話文件的刪除

  3. 這是正確的一般,但如果你要實現自己的會話處理程序,你可以改變會話過期的行爲即使在的session.gc_maxlifetime被忽略

存儲在數據庫會話應該不會改變這些規則這樣一種方式,但可以舒展他們一點點,如果你想。

編輯:

這大致如何可以註冊自己的會話處理器(處理器爲一類),然後做任何你想做的事情

首先,假設我們有一個類,即將會爲我們的應用程序處理會話。

class MySession { 
    function open($save_path, $session_name) { 
    } 

    function close() { 
    } 

    function read($id) { 
    } 

    function write($id, $sess_data) { 
    } 

    function destroy($id) { 
    } 

    function gc($maxlifetime) { 
    } 
} 

要註冊在PHP中的處理程序,您只需要在我們的例子中調用session_set_save_handler功能,如:

// register the session handler 
$sess = new MySession(); 
session_set_save_handler(array($sess, 'open'), 
        array($sess, 'close'), 
        array($sess, 'read'), 
        array($sess, 'write'), 
        array($sess, 'destroy'), 
        array($sess, 'gc')); 

注意,其實有更好的方法來註冊處理程序本身,你可以甚至可以在你的課堂的構造函數中或者其他許多方面做到這一點。但我認爲這不是重點。

重要的是,儘管PHP爲您提供了與會話管理機制的標準行爲相對應的所需變量,但您並不需要尊重它(並非我會推薦這樣做)。

要回答下面留言,忽略maxlifetime參數,你忽略了,在您的氣相色譜法和使用任何你認爲必要/右,例如(使用DB僞代碼):

function gc($maxlifetime) { 
    $sql = "DELETE * FROM MySession WHERE lastAccess < NOW()-3600"; 
    // execute the query, say I have PDO instance in $dbh variable 
    $dbh->execute($sql); 
} 

瞧,你只需完全繞過PHP會話設置。

+0

感謝您的回覆。還有一個問題: 您能否在您的回覆中解釋更多關於第3點的內容? 目前我使用會話管理的默認配置。我無法控制php.ini,因爲它是共享服務器,所以我無法修改session.gc_maxlifetime。 我正在考慮使用數據庫來存儲會話並獨立控制每個會話的生存時間(通過使用記住我的選項)。 – Songo 2011-12-23 14:20:53

+0

感謝您的解釋。你讓我開心 :) – Songo 2012-01-01 10:57:59

1
  1. 正確,session.gc_maxlifetime當會話過期
  2. session_destroy不刪除會話文件
  3. 是,這唯一的辦法將刪除會話文件。在您可以禁用使用session.gc_divider播放的垃圾回收並製作自己的垃圾回收腳本之後,基於Debian的發行版實際上會默認執行此操作。

在一些數據庫中存儲會話不會改變這些規則。

+0

感謝您的回覆。 我無法控制php.ini,因爲它是共享服務器,所以我無法修改session.gc_maxlifetime。 我正在考慮使用數據庫來存儲會話並獨立控制每個會話的生存時間(通過使用記住我的選項)。這是可行的嗎? – Songo 2011-12-23 14:24:53

+1

是的,這是可行的。 – RageZ 2011-12-23 14:26:05

+0

任何教程或例子都會幫助你:)。我實際上使用Zend框架,因此將會話存儲在數據庫中很容易。問題是關於延長獨立會話生命時間沒有任何提及。我認爲rememberMe()函數可以做到這一點,但它只會延長cookie的生命週期。 – Songo 2011-12-23 14:29:16