PHP的session,session檔案,及其過期的問題

alansleep發表於2013-01-31

session作為一種高階點的cookie,本地瀏覽器本地檢視也和cookie差不多,不同的是過期屬性的內容是session.

因為在網路傳輸時只會傳輸一個session id,所以有更好的安全性,也因為這些資料託管於伺服器,所以對伺服器效能有影響.

先看session常用用法.

session_start(); 建立,使用一個session.和前面的cookie,header一樣,該函式會向瀏覽器傳送一個cookie,所以該函式必須在該頁面向瀏覽器傳送任何資料之前呼叫.除非你在最前面已經把快取鎖住:ob_start();

session_name('sessionname'); 修改預設的session的名字.該名字可以在php.ini裡的session.name = PHPSESSID裡設定.瀏覽器檢視cookie時會看到這個名字.該函式需要在session_start之前呼叫.

建立,訪問和刪除session和普通陣列一樣. 下面會有程式碼展示.

session_destory() 手動刪除session檔案.下面會將到session檔案,過期,和垃圾回收的問題.

session_id() 獲取session id.

session_start();
if (isset($_SESSION['time']))
{
    echo session_id();
    echo "< br/>";
    echo $_SESSION['time'];
}
else
{
    $_SESSION['time'] = date("Y-m-d H:i:s");
}

session_start();//繼續操作session unset($_SESSION['time']); // 刪除session裡的time的資料. $_SESSION = array();// 刪除session裡所有的資料 session_destory();// 刪除和該session相關的一切資料,包括session檔案.但不會清理全域性變數裡的資料,如$_SESSION.以及$_COOKIE['PHPSESSID']. 刪除瀏覽器的PHPSESSID仍需setcookie().

所以如果要完整的清理一個使用者的session 至少需要2步.置NULL,destory.

php session檔案位置為php.ini裡的session.save_path的值.預設是一個系統的臨時目錄裡. 還有個經常配置的引數session.cookie_lifetime.session的有效時間.預設是0,表示直到瀏覽器重啟.

和session檔案有關的配置有

session.gc_probability = 1 session.gc_divisor = 1000

上面2個引數的組合 probabilty 除於 divisor 的結果為php的gc(垃圾回收)程式啟動的概率.這裡的概率就是千分之一了.還要注意的是gc程式是依賴web請求來觸發啟動的.如果頁面一個月沒人訪問,那一個月也不會來概率一次.

session.gc_maxlifetime = 1440

session檔案的有效期.預設是1440秒,24分鐘了。 每次重新整理頁面,即session操作後,session檔案的的修改時間則會更新.所以一個合理的gc_maxlifetime會保證瀏覽器的會話狀態一直有效.不會被刪除.

而session.cookie_lifetime則是個更總括的控制.即gc_maxlifetime沒到,但cookie_lifetime到了,會話就會變成無效.

所以合適的gc_maxlifetime可以讓使用者不用重新整理頁面也不會被提示登出了.又如涉及機密的頁面maxlifetime可以設定小點.或者設定cookie_lifetime.

<?php
ini_set("session.gc_divisor", 1);
ini_set("session.gc_maxlifetime", 30);
ini_set("session.cookie_lifetime", 60);
session_start();
if (isset($_SESSION['time']))
{
    echo session_id();
    echo "< br/>".$_SESSION['time'];
    echo "< br/>".$_COOKIE['PHPSESSID'];
}
else
{
    $_SESSION['time'] = date("Y-m-d H:i:s");
}
echo "< br/>".ini_get("session.gc_maxlifetime");
echo "< br/>".ini_get("session.cookie_lifetime");
?>

該程式碼可以用來觀察生成的session檔案.

我的部落格

相關文章