我使用db table存储会话信息,但旧会话不会自动从表中删除。在bootstrap类中,我有配置会话存储句柄的方法:
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但是没有用,为什么?
答案 0 :(得分:1)
会话处理程序使用PHP会话设置来确定何时运行会话垃圾回收。默认情况下,这会占会话使用请求的1%,因此如果您在流量较低的开发网站上对此进行测试,会话将不会立即消失。
理想情况下,您希望完全禁用此功能并运行gc via。 cron(或某些后台进程),以便会话删除不会直接影响您的网站访问者。