啟動會話 — 註冊會話 — 使用會話 — 刪除會話
1.啟動會話
session_start()
通過session_register()函數建立會話
session_register()函數用來為會話登入一個變數來隱含地啟動會話,但要求php.ini檔案的選項,將register_globals指令設定on,
然後重新啟動Apache伺服器。
注意:調用session_register()時,不需要調用session_start()函數,PHP會在註冊變數後隱含的調用session_start()函數。
2.註冊會話
會話啟動後,全部儲存在$_SESSION中。通過數組$_SESSION建立一個會話變數很容易,只要直接該數組添加元素即可。
<?php
session_start(); //啟動session
$_SESSION["admin"] = null; //生命一個admin的變數,並賦空值
?>
3.使用會話
首先判斷會話變數是否有一個會話ID存在,不存在就建立一個,並且使其能通過全域數組$_SESSION 進行訪問。如存在,則講這個會話變數載入以供使用者使用。
例如,判斷使用者名稱Session會話變數是否為空白,不為空白則複製給$myvalue,
<?php
if(!empty($_SESSION['session_name']))
$myvalue = $_SESSION['session_name'];
?>
4.刪除會話
(1)刪除單個會話
使用unset(),但是不能使用unset($_SESSION) 函數會將全域變數$_SESSION銷毀,無法恢複,使用者也不能再註冊$_SESSION 變數。
unset($_SESSION['user']);
(2)刪除多個會話
$_SESSION = array();
(3)結束會話
session_destroy();
session設定時間
1.用戶端沒禁止cookie
(1) session_set_cookie_params() 必須在 session_start() 之前調用
<?php
$time = 1*60; //設定Session失效時間
session_set_cookie_params($time); //使用函數
session_start(); //初始化Session
$_SESSION[username] = 'mr';
?>
說明:不推薦使用此函數,一些瀏覽器有問題。
(2) 使用Setcookie()
<?php
session_start();
$time = 1*60; //給出Session失效時間,1分鐘
setcookie(session_name(),session_id(),time()+$time,"/"); //使用setcookie()手動設定Session失效時間
$_SESSION['user']='mr';
?>
2.用戶端禁止Cookie
(1)登入之前開啟Cookie,很多論壇這麼做
(2)通過GET方法,隱藏表單傳遞session_id (常用)
(3)使用檔案或資料庫儲存session_id,頁面傳遞中手動調用
======================分===========割============線================
Session進階應用程式
1.Session臨時檔案
session_save_path()儲存session臨時檔案,可緩解因臨時檔案的儲存導致伺服器效率降低和網站開啟緩慢的問題
樣本:
<?php
$path = './tmp/'; // 設定session儲存路徑
session_save_path($path);
session_start(); // 初始化session
$_SESSION[username] = true;
echo "Session檔案名稱為:sess_" , session_id();
?>
注意:session_save_path()在session_start()函數之間
2.Session緩衝
session緩衝是將內容儲存在IE用戶端的Temporary Internet Files 檔案夾下,可設定緩衝時間,下次讀取緩衝內容,從而提速。
Session 緩衝使用 session_cache_limiter() 函數
string session_cache_limiter([string cache_limiter])
參數cache_limiter為public 或private。同時session緩衝不在伺服器端而是在用戶端緩衝,在伺服器沒顯示。
緩衝時間,使用 session_cache_expire() 函數
int session_cache_expire([int new_cache_expire])
樣本:
<?php
session_cache_limiter('private');
$cache_limit = session_cache_limiter();
session_cache_expire(30);
$cache_expire = session_cache_expire();
session_start();
?>
3.session資料庫儲存
session_set_save_handler()函數
bool session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)
參數 |
說明 |
open(save_path,session_name) |
找到session儲存地址,去除變數 |
close() |
不需要參數,關閉資料庫 |
read(key) |
讀取session索引值,key對應session_id |
write(key,data) |
其中data對應設定的session變數 |
destroy(key) |
登出session對應session索引值 |
gc(expiry_time) |
清除到期session記錄 |
樣本:
<?phpfunction _session_open($save_path,$session_name){global $handle;$handle = mysql_connect('localhost','root','root') or die('資料庫連接失敗');// 串連MYSQL資料庫mysql_select_db('db_database11',$handle) or die('資料庫中沒有此庫名');// 找到資料庫return(true);}function _session_close(){global $handle;mysql_close($handle);return(true);}function _session_read($key){global $handle;// 全域變數$handle 串連資料庫$time = time();// 設定目前時間$sql = "select session_data from tb_session where session_key = '$key' and session_time > $time";$result = mysql_query($sql,$handle);$row = mysql_fetch_array($result);if ($row){return($row['session_data']);// 返回Session名稱及內容}else{return(false);}}function _session_write($key,$data){global $handle;$time = 60*60;// 設定失效時間$lapse_time = time() + $time;// 得到Unix時間戳記$sql = "select session_data from tb_session where session_key = '$key' and session_time > $lapse_time";$result = mysql_query($sql,$handle);if (mysql_num_rows($result) == 0 )// 沒有結果{$sql = "insert into tb_session values('$key','$data',$lapse_time)";// 插入資料庫sql語句$result = mysql_query($sql,$handle);}else{$sql = "update tb_session set session_key = '$key',session_data = '$data',session_time = $lapse_time where session_key = '$key'";// 修改資料庫sql語句$result = mysql_query($sql,$handle);}return($result);}function _session_destroy($key){global $handle;$sql = "delete from tb_session where session_key = '$key'";// 刪除資料庫sql語句$result = mysql_query($sql,$handle);return($result);}function _session_gc($expiry_time){global $handle;$lapse_time = time();// 將參數$expiry_time賦值為目前時間戳$sql = "delete from tb_session where expiry_time < $lapse_time";// 刪除資料庫sql語句$result = mysql_query($sql,$handle);return($result);}session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc');session_start();$_SESSION['user'] = 'mr';$_SESSION['pwd'] = 'mrsoft';?>
======================分===========割============線================