1. 程式人生 > >session的持久化操作

session的持久化操作

以下部分來自網路:

保持Session的方法:有人說設session.timeout=-1,或小於0的數。這種方法肯定是不行的,session計算時間以分鐘為單位,必須是大於等於1的整數。又有人說設session.timeout=99999。這種同樣不行,session有最大時間限制。我經過測試發現最大值為24小時,也就是說你最大可以session.timeout=1440,1441都是不可以有,呵呵。本人測試環境:win2003+IIS6.0+ASP3.0。 

所以想通過設session.timeout的過期時間讓session永不過期是不可能的。寫到Cookies裡是比較好的方法,網上也有很多這樣的教程,這裡就不再說了!還有就是用在要保持session的頁裡設隱藏iframe每隔一段時間(這個時間小於session.timeout的時間)把重新整理一次frame裡的空頁面!實現方法如下: 



在要保持session頁里加上: <iframe width=0 height=0 src="/blog/SessionKeeper.asp"> 
</iframe> 


同目錄下建一下SessionKeeper.asp的檔案。 <html> 
<head> 
<meta http-equiv="Refresh" content="900000;url=sessionKeeper.asp"> 
<!--每隔900秒重新整理一下自己,為了和伺服器通訊一下,保持session不會丟--> 
</head> 
</html> 


這種方法還是比較長見的,另外還有一種和上面類似的方法,不過他不是用meta自動重新整理巢狀的iframe的方法。他是用javascript:window.setTimeout("functionname()",10000);第隔一段時間時間自動呼叫一個函式的方法,當然函式裡還是要去連線一個空的檔案。具體方法如下: 


在要保持session面里加上: <script id=Back language=javascript></script> 

<script language=javascript> 
function keepsession(){ 
document.all["Back"].src="/blog/SessionKeeper.asp?RandStr="+Math.random(); 
//這裡的RandStr=Math.random只是為了讓每次back.src的值不同,防止同一地址重新整理無效的情況 
window.setTimeout("keepsession()",900000); //每隔900秒呼叫一下本身 


keepsession(); 
</script> 

這樣同一目錄下建一個空內容的sessionKeeper.asp就檔案就可以了!

以下為自己實操:寫入檔案與寫入cookie原理一樣,寫入cooikie貌似並不能持久,如果失效後新使用者訪問怎麼取回來?

寫入資料庫就沒必要了吧。

寫入檔案即可:

if($_POST){
  if(isset($_SESSION['uid']) && file_exists('./uid.txt')){
      $uid = $_SESSION['uid'] = $_SESSION['uid']+1; //如果session失效後來會在下面設定,來到這裡後肯定是下一次請求,這裡加1也正好合適
      $myfile = fopen("./uid.txt","w");
      fwrite($myfile,$uid);
  }else{
    $uid = $_SESSION['uid'] = 1;
    if(file_exists('./uid.txt')){
      $myfile = fopen("./uid.txt","r+");
      $uid = $_SESSION['uid'] = fread($myfile,filesize("./uid.txt"))+1; //因為到達這裡肯定是新請求所以加1才合適
    }else{
      $myfile = fopen("./uid.txt","w");
      fwrite($myfile,$uid);
    }
  }