php 開發時一個啟用了session_start()頁面,由於執行時間過長,導致如果一個用戶在訪問,另一個用戶啟用session_start()的時候處於阻塞狀態。
直到第一個用戶完畢 ,第二個才能啟用。開始讀取。這就是session阻塞。
session 默認以文件保存,當一個用戶訪問session_start頁面后。這個時候,就會默認創建一個包含 session_id文件名,並且這個時候。會對文件進行鎖定。如果這個用戶點擊鏈接。又訪問一個該站的session文件,由於 第一個頁面沒有執行完。他一直鎖定了該文件。所以第二個頁面就不能獲取鎖,一直處於等待狀態、。這樣如果是網站上有大量的用戶訪問,會導致session讀取文件一直阻塞等待着,用戶瀏覽器一直跟服務器保持連接買回消耗很多服務器資源 、web 服務站活躍連接數也會增大。可能就會耗費完連接資源。出現拒絕服務器。
------用memcache 存放用戶session
用memcache 保存用戶session ,相比讀取文件有很大速度提升。而且可以做到服務器共享session 確實很方便,這個時候就不會出現 用文件session 鎖定清理、memcached 讀取時候,是共享的,不會出現等待,但是我們發現。memcached 連接數。還是會保持着,並且,連接數會增加。如果這個時候。你設置的memcached連接數過小。你會發現。很快memcached 就掛死了。 這也是長出現的問題。,有時候web 服務器很多,session(memcache)很少,發現memcache 莫名死掉。可能跟這個有關系。太多的反映很慢的頁面(啟用session) ,會大道至占用太多的memcached連接數。
改變session使用習慣、優化調用方法
其實,通過file或者session,如果處理耗時頁面,都會帶來服務器資源很大消耗。
實我們一般寫入session或者讀取時候,如果自己能夠控制。
用完了,就關閉掉文件鎖,或者mem連接。就會自動釋放資源,其實,php里面的:session_write_close,session_commit 函數就能做到改功能。
<?php ini_set('session.save_path','/tmp/'); function open($save_path, $session_name) { echo __FUNCTION__,"<br />"; return(true); } function close() { echo __FUNCTION__,"<br />"; return(true); } function read($id) { echo __FUNCTION__,"<br />"; } function write($id, $sess_data) { echo __FUNCTION__,"<br />"; return(true); } function destroy($id) { echo __FUNCTION__,"<br />"; return(true); } function gc($maxlifetime) { echo __FUNCTION__,"<br />"; return true; } session_set_save_handler("open", "close", "read", "write", "destroy", "gc"); register_shutdown_function('test'); function test() { echo __FUNCTION__,"<br />"; } session_start(); echo 'aaaaa',"<br />";
啟動”session_start” 會自動執行,open,read函數,然后頁面執行完,會執行shutdown函數,最后會把session寫入進去,然后執行close關閉文件。從session_start 到頁面結束,會一直鎖定文件或者保持連接的。
我們如果 執行完session_start后,執行”session_commit();” 看看結果
執行過程: 執行commit后,直接會調用,wirte,close操作。直接關閉文件或者關閉連接(memcache)了。
-
我們的問題
1.我們頁面有多次寫入,怎么樣操作?
第一次寫入后,然后提交,再次打開寫入,然后再次提交。我們發現,2次數據都保存到用戶session中了。
-
我們來總結下吧
1.只讀取session頁面,建議打開后,就直接commit,這是$_SESSION變量已經生成了。
2.有對session進行寫入頁面,建議修改完$_SESSION后,直接調用commit
3.多次打開並且寫入,這個不建議使用,比較打開文件,寫入都是耗費時間的。如果能一次搞定的,就不要做多次了。 除非,中間執行很耗時的業務。