php session阻塞頁面分析及最佳化 (session_write_close session_commit使用)

來源:互聯網
上載者:User

標籤: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使用)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.