Session鎖和session_write_close和session_commit函數

session默認是文件存儲,也可以存在數據庫和內存,存入內存可以使用Memcached和Redis技術

Session默認存在文件中,在這種情況下:使用session_start()函數之後就會對該sessionId文件鎖定,

直到還腳本執行完畢才存入文件和解鎖,

當一下情況會非常耗時:

1:一個頁面有多個ajax請求,並且多個ajax請求頁都涉及到session,即都得操作同一個session文件,

由於鎖定ajax的執行必須是逐個執行的。

2:同時訪問一個網站的多個頁面,各個頁面都涉及session操作,這樣也得逐個頁面的執行

3:等等這樣一個看似小的問題,實際上,如果網站上面有大量用戶訪問,會導致session讀取文件一直阻塞等待着。用戶瀏覽器一直跟服務器保持連接,會消耗很多服務器資源。web服務器活躍連接數也會增大,可能很快就會耗費完連接資源,出現拒絕服務器。

如果存入數據庫或內存,則這些數據就是共享的可以同時讀取。如Memcached,我們發現不會出現用文件保存session鎖定清理。memcached讀取時候,是共享的,不會出現等待。但是,我們會發現,memcached連接數,還是會保持着。並且,連接數會增加,如果這個時候,你設置的memcached連接數過小,你會發現,很快memcached就掛死了。 這也是,做memcache接管session時候,經常遇到問題。 有時候,web服務器很多,session(memcache)很少。發現memcache莫名其妙死掉,可能跟這個有關係。太多反映很慢的頁面(啓動session),會導致佔用了大量memcached連接數。

其實,通過file或者session,如果處理耗時頁面,都會帶來服務器資源很大消耗。其實我們一般寫入session或者讀取時候,如果自己能夠控制。用完了,就關閉掉文件鎖,或者mem連接。就會自動釋放資源,其實,php裏面的:session_write_close,session_commit 函數就能做到改功能。


session_commit是session_write_close的別名,功能是:前面的session數據存入或讀取,然後關閉session,釋放鎖定資源,其他的session_start可以執行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章