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


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 />";

image

啟動”session_start” 會自動執行,open,read函數,然后頁面執行完,會執行shutdown函數,最后會把session寫入進去,然后執行close關閉文件。從session_start 到頁面結束,會一直鎖定文件或者保持連接的。

 

我們如果 執行完session_start后,執行”session_commit();” 看看結果

image image  

執行過程: 執行commit后,直接會調用,wirte,close操作。直接關閉文件或者關閉連接(memcache)了。

 

  • 我們的問題

1.我們頁面有多次寫入,怎么樣操作?

image image

image

 

第一次寫入后,然后提交,再次打開寫入,然后再次提交。我們發現,2次數據都保存到用戶session中了。

 

  • 我們來總結下吧

1.只讀取session頁面,建議打開后,就直接commit,這是$_SESSION變量已經生成了。

2.有對session進行寫入頁面,建議修改完$_SESSION后,直接調用commit

3.多次打開並且寫入,這個不建議使用,比較打開文件,寫入都是耗費時間的。如果能一次搞定的,就不要做多次了。 除非,中間執行很耗時的業務。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM