還記得在剛開始用CodeIgniter的時候,碰到要處理session的問題,很習慣地把$_SESSION變數dump出來,結果居然完全找不到我記錄的session變數?哪去了?
為了這個問題查了好一陣子,查到最後終於把它澈底搞懂了。
CI的session是將user agent和一些server變數,加密後儲存在資料表中,並記錄在本地端的cookie中;在瀏覽網頁的時候,則是將本地端的cookie送至server,比對資料庫、取回session紀錄。
CI這樣設計的好處,是為了現在許多的網頁伺服器都不是單一主機的架構,而是用了多部主機,規劃成負載平衡和HA架構的;在這樣的伺服器群中,因為PHP的原生Session是儲存在伺服器的記憶體中,而當瀏覽器連入的伺服器被切換掉了,就會因為無法取得Session記錄,導致使用者連線中斷。
Cookie儲存在Client端,而資料庫則是跨伺服器共用的資料,CI藉由這樣實作session的機制,就可以跨越多部伺服器切換的問題,保持session的連線狀態。
此外,因為session使用的是伺服器記憶體,而隨著使用者數量的增加,session佔用的記憶體會大增,造成伺服器的負擔。CI把Session被存入資料庫的另一個好處,就是可以降低伺服器在這方面的負載。