標籤:des style blog http io ar color os 使用
php 開發時一個啟用了session_start()頁面,由於執行時間過長,導致如果一個使用者在訪問,另一個使用者啟用session_start()的時候處於阻塞狀態。
直到第一個使用者完畢 ,第二個才能啟用。開始讀取。這就是session阻塞。
session 預設以檔案儲存,當一個使用者訪問session_start頁面後。這個時候,就會預設建立一個包含 session_id檔案名稱,並且這個時候。會對檔案進行鎖定。如果這個使用者點選連結。又訪問一個該站的session檔案,由於 第一個頁面沒有執行完。他一直鎖定了該檔案。所以第二個頁面就不能擷取鎖,一直處於等待狀態、。這樣如果是網站上有大量的使用者訪問,會導致session讀取檔案一直阻塞等待著,使用者瀏覽器一直跟伺服器保持串連買回消耗很多伺服器資源 、web 服務站活躍串連數也會增大。可能就會耗費完串連資源。出現拒絕伺服器。
------用memcache 存放使用者session
用memcache 儲存使用者session ,相比讀取檔案有很大速度提升。而且可以做到伺服器共用session 確實很方便,這個時候就不會出現 用檔案session 鎖定清理、memcached 讀取時候,是共用的,不會出現等待,但是我們發現。memcached 串連數。還是會保持著,並且,串連數會增加。如果這個時候。你設定的memcached串連數過小。你會發現。很快memcached 就掛死了。 這也是長出現的問題。,有時候網頁伺服器很多,session(memcache)很少,發現memcache 莫名死掉。可能跟這個有關係。太多的反映很慢的頁面(啟用session) ,會大道至佔用太多的memcached串連數。
改變session使用習慣、最佳化調用方法
其實,通過file或者session,如果處理耗時頁面,都會帶來伺服器資源很大消耗。
實我們一般寫入session或者讀取時候,如果自己能夠控制。
用完了,就關閉掉檔案鎖,或者mem串連。就會自動釋放資源,其實,php裡面的:session_write_close,session_commit 函數就能做到改功能。
<?phpini_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.多次開啟並且寫入,這個不建議使用,比較開啟檔案,寫入都是耗費時間的。如果能一次搞定的,就不要做多次了。 除非,中間執行很耗時的業務。
php session阻塞頁面分析及最佳化 (session_write_close session_commit使用)