的session expiration logic I mentioned確實已經在做你期待什麼:一旦它已過期,不能使用的會話。
會話數據仍在存儲中並不重要,因爲它在到期後不能使用;它將在垃圾收集器下次運行時被刪除。在session_start
撥打電話(另請參閱How long will my session last?)之後,session.gc_probability的概率除以session.gc_divisor。
編輯既然你想在一個過期的會話執行一些其他任務,我寧願建議使用custom session save handler。
當使用的會話保存處理的一類,你可以寫兩個類,一個用於基礎存儲處理器和一個與執行額外的任務延長垃圾收集器,如:
interface SessionSaveHandler {
public function open();
public function close();
public function read($id)
public function write($id, $data);
public function destroy($id);
public function gc($callback=null);
}
class SessionSaveHandler_WithAdditionalTasks implements SessionSaveHandler {
// …
public function gc($callback=null) {
if (!is_null($callback) && (!is_array($callback) || !is_callable($callback))) return false;
while (/* … */) {
if ($callback) $callback[0]::$callback[1]($id);
// destroy expired sessions
// …
}
}
public static function doAdditionalTasksOn($id) {
// additional tasks with $id
}
}
session_set_save_handler(array('SessionSaveHandler_DB_WithAdditionalTasks', 'open'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'close'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'read'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'write'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'destroy'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'gc')
);
如果您不希望在下一個請求中銷燬過期的會話,您希望發生什麼? – Gumbo 2010-09-03 14:34:13
我沒有看到這裏的問題,除非你依賴過期代碼做一些額外的清理。如果是這種情況,那麼也許一個cron腳本將是一個更好的選擇? – 2010-09-03 14:37:24
我確實希望它被銷燬,但不希望依賴用戶在會話實際銷燬之前發出另一個請求。 – Timo 2010-09-03 14:39:14