php中Session的自動回收機制詳解

來源:互聯網
上載者:User
一般情況下,可以通過在頁面提供的一個“退出” 按鈕,單擊來銷毀本次會話。但是使用者如果沒有點擊退出按鈕,而是直接關閉瀏覽器,或者斷網,或者斷電直接關閉電腦等情況下,在伺服器端儲存的 Session 檔案是不會被刪除的。雖然關閉了瀏覽器,下次需要分配一個新的 Session ID 重新登入,但這隻是因為在 php.ini 中的設定 session.cookie_lifetime = 0, 來設定 Session ID 在用戶端 Cookie 中的有效期間限,以秒為單位指定了發送到瀏覽器的 Cookie 的生命週期。值為0 表示 “直到關閉瀏覽器”,預設為 0.

當系統賦予 Session 有效期間限後,不管瀏覽器是否開啟,Session ID 都會自動消失。而用戶端的 Session ID 消失,服務端儲存的 Session 檔案並沒有被刪除。所以沒有被 Session ID 引用 的伺服器端 Session 檔案,就成為 “ 垃圾 ”。 為了防止這些垃圾 Session 檔案對系統造成過大的負荷(因為 Session 並不像 Cookie 是一種半永久性的存在), 對於永遠也用不上的 Session 檔案(垃圾檔案),系統有自動清理的機制。

服務端儲存的 Session 檔案 就是一個普通的文字檔,所以都會有檔案的修改時間。“ 記憶體回收程式 ” 啟動後就是根據 Session 檔案的修改時間 ,將到期的 Session 檔案全都給刪除了。

“ 記憶體回收程式 ” 是什麼樣的啟動機制呢?

“ 記憶體回收程式 ” 是在調用 session_start()函數時啟動的。 而一個網站有多個指令碼,每個指令碼又都要使用 session_start()函數開啟會話,又會有很多個使用者同時訪問,這就很有可能使得 session_start()函數在 1秒內被調用了 N 次,而如果每次都會啟動 “ 記憶體回收程式 ” ,這樣就很不合理了。即使最少控制在 15分鐘以上啟動一次 “ 記憶體回收程式 ” ,一天也要清理 100多次,這樣太頻繁了。 通過在 php.ini 檔案中修改 session.gc_probabilitysession.gc_divisor 兩個選項,設定啟動記憶體回收程式的機率。系統會根據session.gc_probability/session.gc_divisor 公式計算機率,例如選項 session.gc_probability = 1,選項 session.gc_divisor = 100,這樣機率就變成了 1/100,也就是 session_start()函數被調用 100 次才會啟動一次 “ 記憶體回收程式 ” 。所以對會話頁面訪問越頻繁,啟動的機率就越來越小。一般的建議為 調用1000-5000次才會啟動一次: 1/(1000~5000)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.