2011-10-03 51 views
0

我正在使用Yii框架構建購物車。我創建了一個購物車模型來存儲用戶添加到購物車的物品,並且使用存儲當前會話的session_id字段來跟蹤顧客購物者添加到購物車的產品。Yii:在會話GC上搭載購物車清理?

但是,如果購物者放棄購物車或會話在他們繼續結帳之前就超時了,我發現在購物車表中有一堆需要清理的記錄。

我在想這樣做的最好方法是捎帶回收Yii用來清理會話表的垃圾回收過程,但我不知道如何做到這一點,或者即使這是最好的辦法。

我在正確的軌道上嗎?

如果是這樣,我怎麼去捎帶Yii的垃圾收集?

+0

你最好的選擇可能是運行一個cron工作。在清除數據之前,您甚至可能還想收集關於該數據的一些統計信息。 – ldg

+0

使用cron作業當然是一種選擇。但我希望能夠使用Yii的功能來處理這個問題。這應該使收集統計更簡單。 –

回答

2

我對PHP的會話垃圾收集不太瞭解,所以我不知道這是否比cron工作更好。小我只知道我剛剛從谷歌教授瞭解到,這讓我覺得依靠會話垃圾收集可能不會像你想可靠:

How do I expire a PHP session after 30 minutes?

但它可以工作,我想。實際上,如果有的話,那種聰明。在這種情況下,您需要重寫Yii內核中的CDbHttpSession類中的gcSession()方法(假設您正在使用數據庫會話存儲)。實際上,你可以很容易地在你的config.php文件中覆蓋這個方法。

首先,創建新的MyCustomHttpSession類,它擴展了CDbHttpSession(可能將其放在/ components文件夾中)。 一定要將新的自定義Cart垃圾收集添加到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 
), 
), 

我沒有測試這一點,但它應該只是罰款。祝你好運!

+0

太棒了!謝謝。 –