我使用db表来存储会话信息,但旧会话不会自动从表中删除。在引导程序类中,我有配置会话存储句柄的方法:
protected function _initSessionHandle(){
//setup your DB connection like before
//NOTE: this config is also passed to Zend_Db_Table so anything specific
//to the table can be put in the config as well
$oMultiDb = Zend_Registry::get('multidb');
$oDbAdapter = $oMultiDb->getDb('db2');
$aConfig = array(
'name' => 'session', //table name as per Zend_Db_Table
'primary' => array(
'id', //the sessionID given by PHP
),
'modifiedColumn' => 'modified', //time the session should expire
'dataColumn' => 'data', //serialized data
'lifetimeColumn' => 'lifetime', //end of life for a specific record
'db' => $oDbAdapter,
);
//Tell Zend_Session to use your Save Handler
$oSessionSaveHandle = new Zend_Session_SaveHandler_DbTable($aConfig);
//$oSessionSaveHandle->gc(0);
Zend_Session::setSaveHandler($oSessionSaveHandle);
Zend_Session::start();
}
只有当我在代码$oSessionSaveHandle->gc(0);
中设置时,旧会话才会被删除。为什么这不是自动发生的?当我们转到Zend_Session::setSaveHandler方法声明时
session_set_save_handler(
array(&$saveHandler, 'open'),
array(&$saveHandler, 'close'),
array(&$saveHandler, 'read'),
array(&$saveHandler, 'write'),
array(&$saveHandler, 'destroy'),
array(&$saveHandler, 'gc')
);
我们看到gc()方法被传递给session_set_handle,但不起作用,为什么?
会话处理程序使用PHP会话设置来确定何时运行会话垃圾收集。默认情况下,这会在1%的会话使用请求上运行,因此,如果您在流量较低的开发网站上进行测试,则会话不会立即消失。
理想情况下,您希望完全禁用此功能,并通过运行gc。cron(或一些后台进程),这样会话删除就不会直接影响网站访问者。