的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