2011-12-07 42 views
5

我有一個購物車應用程序,其中帶有唯一物品,數量爲1 - 當用戶將一個物品放入購物籃時,我需要耗盡庫存數量以避免其他人購買。問題是,如果他們放棄購物車而沒有購買,我需要把物品放回庫存。PHP在會話過期時運行一個腳本

當購物車會話過期時,我可以補充庫存嗎?即運行一個腳本來替換庫存。

+0

這樣做似乎有點奇怪。例如,我可以將所有商品添加到我的購物車中。如果你的正常會話是20分鐘,你將不會有20分鐘的股票。當有人退房時,爲什麼不直接取出呢?然後,您也可以點擊退房時進行支票,以確保它仍在庫存中。 –

+0

我不會在將它們放入購物車時將其從庫存中移除,但只有在實際購買時纔會將它們從庫存中移除。 – Gumbo

+0

謝謝,我同意,但這不是我的決定! –

回答

4

您可以使用session_set_save_handler來創建自定義會話處理類。 當你這樣做時,你可以決定在垃圾收集器被調用時或者在會話銷燬時需要運行的其他操作。如果您決定使用垃圾收集器,請確保您也知道session.gc_divisorsession.gc_probability的值,並瞭解它們的作用(這些設置垃圾收集器將運行的可能性)。

+0

這就是我們要去的謝謝 –

+0

@jimsmith我很高興它有幫助 – mishu

0

創建數據庫表以跟蹤會話活動,比如sessions。其中至少要輸入session_id和DATETIME或TIME字段last_activity

如果你沒有這樣做了,也創造了一個carts表中包含車的內容(如product_idquantity),並有一個鏈接到session_id。然後,有兩種情況:

  1. 用戶完成訂單,只是「擦除」屬於其會話的carts表中的行。
  2. 用戶放棄購物車,調用一個cronjob來檢查last_activity的值是否超過您希望的值(比如說一個小時以前)。使該腳本以購物車中的數量重新存儲您的供應。

請注意,您需要更新bootstrap/loader(在每個加載的頁面上觸發的機制)中的last_activity字段。

1

爲了避免cron作業的需要;保持簡單:

  1. 用戶摘放置一個對象在他/她的籃子
  2. 時間戳「放置在籃子對象」被存儲在數據庫中,並且超時時間戳存儲了。例如(time() + (60*20))
  3. 用戶關閉網頁
  4. 在每個頁面上,您都會執行一個簡單的mysql查詢來檢查timeout-timestamps是否小於當前時間戳。如果查詢返回結果,則從籃子中刪除並放回插槽中。

(這需要您更新某種數據庫過於「最後活動」)

應該是相當直截了當。