我正在使用Yii框架构建购物车。我已经创建了一个购物车模型来存储用户添加到购物车中的商品,并且通过使用存储当前会话的session_id字段来跟踪访客购物者添加到购物车中的产品。
但是,如果购物者放弃购物车,或者会话在他们继续到结账之前超时,我发现购物车表中有一堆记录需要清理。
我在想,最好的方法是利用Yii用来清理会话表的垃圾收集过程,但我不确定如何做到这一点,或者这是否是最好的方法。
我是不是走对了路?
如果是这样,我该如何利用Yii的垃圾收集呢?
发布于 2011-10-04 19:40:05
我不太了解PHP的会话垃圾收集,所以我不知道这是不是比cron工作更好的方法。据我所知,我是从Google教授那里学到的,这让我觉得依赖会话垃圾收集可能并不像你想的那样可靠:
How do I expire a PHP session after 30 minutes?
但我想,这是可行的。实际上,如果真的是这样的话,还是挺聪明的。在这种情况下,您需要覆盖Yii核心中CDbHttpSession类中的gcSession()方法(假设您所说的是使用数据库会话存储)。实际上,您可以很容易地在config.php文件中覆盖此方法。
首先,创建扩展CDbHttpSession的新MyCustomHttpSession类(可能将其放在/components文件夹中)。确保将新的定制购物车垃圾收集添加到gcSession()函数中!
class MyCustomHttpSession extends CDbHttpSession
{
public function gcSession($maxLifetime) {
/**** ADD YOUR CUSTOM LOGIC HERE ****/
$sql="DELETE FROM {$this->sessionTableName} WHERE expire<".time();
$this->getDbConnection()->createCommand($sql)->execute();
return true;
}
}然后,告诉Yii在组件配置数组中使用新的MyCustomHttpSession类:
'components'=>array(
'session'=>array(
'class' => 'application.components.MyCustomHttpSession',
'connectionID' => 'db',
'timeout'=>14400, // 4 hour session time
),
),我没有对此进行测试,但它应该工作得很好。祝好运!
https://stackoverflow.com/questions/7630378
复制相似问题