Zend_Session_SaveHandler_Db - 不删除旧会话

时间:2013-12-04 12:38:34

标签: php session zend-framework zend-session

我使用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但是没有用,为什么?

1 个答案:

答案 0 :(得分:1)

会话处理程序使用PHP会话设置来确定何时运行会话垃圾回收。默认情况下,这会占会话使用请求的1%,因此如果您在流量较低的开发网站上对此进行测试,会话将不会立即消失。

理想情况下,您希望完全禁用此功能并运行gc via。 cron(或某些后台进程),以便会话删除不会直接影响您的网站访问者。