
重點整理
- 過期的 Session 若未清理,會佔用資料庫空間並拖慢網站。
- 傳統的隨機抽籤清理機制,會導致部分網頁載入時卡頓等待。
- 改用背景排程指令自動清理,可讓網頁請求不再受清理工作影響。
- 若使用 Redis 等快取儲存方式,系統會自動處理過期資料。
很多企業主會發現,自己的網站剛上線時跑得很快,但用了一段時間後,偶爾會遇到網頁載入突然變慢、甚至卡住的情況。除了前端圖片過大或主機效能不足,其實「後台資料庫塞滿垃圾資料」也是常見的隱藏元兇。這篇文章將帶你了解,系統背景是如何處理這些過期資料,以及如何透過簡單的機制調整,讓你的網站隨時保持輕快流暢。
什麼是 Session?為什麼過期了還會佔用空間?
當使用者登入你的網站,或是把商品加入購物車時,系統需要暫時記住這些狀態,這個機制在技術上稱為 Session(工作階段,即系統暫時記住使用者登入或購物車狀態的機制)。為了記住這些狀態,系統會選擇不同的 Driver(儲存方式)來存放資料。
如果你的網站使用 database(資料庫)或 file(檔案)來儲存 Session,當使用者關閉網頁或超過系統設定的有效時間後,這些 Session 就「過期」了。但請注意,過期不代表系統會自動把它們刪除。這些過期的資料會一直留在資料庫或伺服器裡,隨著時間推移,越積越多,不僅佔用儲存空間,也可能在系統讀取時增加負擔。
傳統的「抽籤清理機制」:讓網站變慢的隱形殺手
既然過期資料不會自動消失,系統總要清理它們。在較早期的設計中,系統採用了一種 Lottery(抽籤機制,即系統隨機決定是否執行清理的機率設定)來決定何時清理。
這就像是在餐廳裡,每次有客人上門(即網頁請求),系統就會抽一次籤。如果抽中了,系統就會在回覆客人之前,先停下來打掃過期的 Session。預設的抽籤機率是百分之二,這意味著每 100 次網頁請求,大約有 2 次會遇到打掃。
這種機制的最大問題在於「不確定性」。當你的網站流量很大時,每分鐘可能會有好幾次清理工作同時發生,導致部分使用者的網頁載入時間突然變長;而如果網站流量很小,可能好幾天都不會抽中,過期資料就一直卡在那裡。這會讓使用者覺得網站速度不穩定。
現代解法:排程自動清理,讓網頁請求不再等待
為了解決這個問題,現代的系統框架(如 Laravel 13.39 以上版本)引入了專屬的排程指令 session:garbage-collect。
這個概念就像是「安排專屬清潔員,在離峰時間固定打掃」。你可以設定系統每小時自動在背景執行一次清理,同時把原本的抽籤機率調為零。這樣一來,所有的網頁請求都不需要再等待清理工作完成,網站速度就能保持穩定。
值得一提的是,如果你的網站使用 Redis、Memcached 等快取系統來儲存 Session,這些系統本身就會自動處理過期資料,就不需要額外設定清理排程。此外,如果你的網站部署在多台伺服器上,還可以加上 onOneServer() 設定,確保同一時間只有一台伺服器執行清理,避免資源浪費。若是較舊版本的系統,也可以透過排程閉包(Closure)的方式來達到相同的清理效果。
崴米的建議
了解了後台清理機制後,我們建議你可以從以下兩個方向來優化網站:
- 與工程師確認清理機制:請你的工程師檢查目前的 Session 儲存方式,如果是使用資料庫或檔案儲存,建議關閉隨機的抽籤清理,改為設定背景排程指令來定時清理,確保網頁載入不受影響。
- 定期檢視網站整體效能:後台清理只是影響速度的一環。如果網站依然感覺卡頓,建議 把網站的分數和體感一起拉回來,從前端到後台進行全面優化;你也可以先 替現有網站做一次免費健檢,找出拖慢速度的真正原因。
參考來源:Delete Expired Sessions in Laravel With a Scheduled Command



