Yii:捎带会话GC进行购物车清理?

时间:2011-10-03 01:31:06

标签: session garbage-collection yii

我正在使用Yii框架构建购物车。我创建了一个购物车模型来存储用户添加到购物车的商品,我通过使用存储当前会话的session_id字段来跟踪购物者购物者添加到购物车的产品。

但是,如果购物者放弃购物车或会话只是在他们进行结账前超时,我发现购物车表中有一堆需要清理的记录。

我在想这样做的最好方法是捎带Yii用来清理会话表的垃圾收集过程,但我不知道怎么做,或者即使这是最好的方式。

我在这里走在正确的轨道上吗?

如果是这样的话,我该如何捎带Yii的垃圾收集?

1 个答案:

答案 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
  ),
),

我没有对此进行测试,但它应该可以正常工作。祝你好运!