我正在使用Yii框架构建购物车。我创建了一个购物车模型来存储用户添加到购物车的商品,我通过使用存储当前会话的session_id字段来跟踪购物者购物者添加到购物车的产品。
但是,如果购物者放弃购物车或会话只是在他们进行结账前超时,我发现购物车表中有一堆需要清理的记录。
我在想这样做的最好方法是捎带Yii用来清理会话表的垃圾收集过程,但我不知道怎么做,或者即使这是最好的方式。
我在这里走在正确的轨道上吗?
如果是这样的话,我该如何捎带Yii的垃圾收集?
答案 0 :(得分:2)
我对PHP的会话垃圾收集知之甚少,所以我不知道这是否比cron作业更好。我知道的一点点我刚从谷歌教授那里学到了,这让我觉得依赖会话垃圾收集可能不如你想要的那么可靠:
How do I expire a PHP session after 30 minutes?
但我认为它可行。有点聪明,实际上,如果确实如此。在这种情况下,您需要覆盖Yii核心中的CDbHttpSession类中的gcSession()方法(假设,正如您所说,您正在使用数据库会话存储)。实际上,您可以在config.php文件中轻松覆盖此方法。
首先,创建新的MyCustomHttpSession类,该类扩展CDbHttpSession(可能将其放在/ 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
),
),
我没有对此进行测试,但它应该可以正常工作。祝你好运!