程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 嚴格控制session的過期時間

php 嚴格控制session的過期時間

編輯:關於PHP編程

php 嚴格控制session的過期時間


工作過一段時間,相信大家一定也碰到過一個問題:          1.前台用戶不知道怎麼的就自動掉線了.         2.後台退出登陸之後所有的前台用戶也都掉線了.         3.我想控制我的用戶半個小時自動下線,發現改了配置文件也不好使.       上述的所有問題都是我近期碰到的,後來通過查詢知道:php的session機制由幾個參數同時控制,具體是哪些我就不具體寫了,分別是一個概率,一個最大過期時間,還有一個session的存儲路徑.在php.ini中我們可以看到,php的session的默認過期時間位24分鐘,也就是說如果我們24分鐘沒有操作頁面,這個session就過期了,當然這是理想狀態下.24分鐘之後php會出發一個session的回收機制,這個機制用來檢測默認存儲目錄下的session文件的更改時間是否為24分鐘之前,如果是那麼刪除session.當然這也是理想狀態下.這就是前面提到的一個概率了,session的回收機制是按概率觸發的,也就是說,即使你的session為24分鐘之前的文件,如果步觸發回收機制你的session依然沒有過期.這當然也不是我們想要的了.為了解決這個問題就出現了我前面提到的第三個參數,也就是session的存儲路徑,如果你沒有開啟php.ini內部的session.save_path那麼session是不會有文件產生的,所以為了能更加有效的控制session我們將其打開並且填寫一個路徑,或者在文件中用session_save_path(".....")函數來定義這個session的存儲的路徑.還有一點很重要,那就是成如果session存儲在我們自己定義的路徑內部,seesion的回收機制是不起作用的.所以只能我們自己來控制session的過期時間了.     下面是一個我自己根據理解寫的一個關於session的過期處理類         
<?php 
class Session{
private $savePath;//存儲session的路徑,必須是絕對路徑
private $time;//存儲session的過期時間,單位是秒
private $sessionName;//session的名字
private $sessionValue;//session的值

public function __construct($savePath)
{
//將session存入指定的目錄
$this->savePath = $savePath;
            //注意:這個一定要寫在session_start前面
session_save_path($this->savePath); 

session_start();//開啟session
if(!is_dir($this->savePath))
{
                //默認為最大的權限 0777
mkdir($this->savePath) or die('系統錯誤!');
}
}

//創建session  一共三個參數,
               // $name->session名字 
               // $val->session值 
               // $time->過期時間,默認為30分鐘
public function setSession($name,$val,$time=1800)
{
$this->sessionName  = $name;
$this->sessionValue  = $val;
$this->time       = $time;
if(!isset($_SESSION[$this->sessionName]))
{
if(is_array($this->sessionValue))
{
foreach($this->sessionValue as $key=>$val)
{
$_SESSION[$this->sessionName][$key] = $val;
}
}
else
{
$_SESSION[$this->sessionName]['val']   = $this->sessionValue;
}
$_SESSION[$this->sessionName]["startTime"] = time();
}
//這時候說明session已經存在,那麼我們判斷他是否過期,如果過期,刪除session
else if(isset($_SESSION[$this->sessionName]["startTime"]) && time()-$_SESSION[$this->sessionName]['startTime']>=$this->time)
{
unset($_SESSION[$this->sessionName]);
}
}
}
 ?>

 

      通過這個類我們可以達到幾個目的:                     1.我們可以明確的控制session的過期時間.                     2.對應上面的第二個問題,我之前做用戶退出登陸的時候通常這樣寫 session_destroy();或者寫成unset($_SESSION);殊不知這樣就把所有的session都清除了,所以我們會遇到前面一個用戶退出之後,我們自己的session也被刪除了.                     3.用戶不會無緣無故的掉線了,因為對我們來說每個步驟現在都是透明的了.    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved