Zend_Session_SaveHandler_Db-don';t删除旧会话


Zend_Session_SaveHandler_Db - don't delete old sessions

我使用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(或一些后台进程),这样会话删除就不会直接影响网站访问者。