PHP-會話技術
B/S請求響應模式是無狀態的。任意的請求間不存在任何的聯系,不能將請求狀態保持下去。
會話技術可以給每個瀏覽器分配持久數據,這些數據不會隨著一次請求和相應結束而銷毀。
COOKIE
cookie是一種允許服務器端腳本在瀏覽器端存儲數據的技術。
cookie特點:
- 允許服務器向瀏覽器發送指令,用來管理存儲在瀏覽器端的cookie數據。
- 瀏覽器如果存儲了某臺服務器所設置的cookie數據,瀏覽器再向服務器請求時,會攜帶存儲的cookie數據到服務器端。
- cookie的有效期,有效路徑等在瀏覽器進行判斷是否發送給服務器端
設置cookie
setCookie(KEY, VALUE, [有效期(時間戳表示)], [有效路徑], [有效域], [是否僅安全傳輸], [HTTPONLY])
==setCookie()前不能存在任何的輸出==
KEY:
設置成數組形式(user[name])在瀏覽器保存時是字符串,獲取時被PHP整理成數組。
有效期:
- 0:表示會話周期(默認值)
- PHP_INT_MAX:邏輯上表示永久有效的cookie
有效路徑:
- 默認在當前路徑及其後代路徑有效(通常設置為‘/‘站點根目錄有效,也就是整站有效)
- 這裏的路徑不是代碼所在文件的本地磁盤路徑,而是URL請求的路徑關系
- 不同路徑下同名的cookie可以同時存儲於瀏覽器端
- 瀏覽器發出請求時,會先查找當前目錄內有效的cookie,再向上查找,將所有有效的邏輯上表示永久有效的cookie都攜帶到服務器端,服務器在形成$_COOKIE時,會出現重寫效果,先出現的保留
有效域:
- 默認在當前域下有效。
- 通過設置,可以使cookie的有效域擴展到某個一級域名下的所有子域(.domain_name.com)
是否僅安全傳輸:
- 默認不論瀏覽器發出的是http還是https都會將有效的cookie攜帶的服務器端
- 設置為true表示激活僅安全連接傳輸,此時瀏覽器在向服務器發出請求時,如果請求協議為http,就不會向服務器發送這些設置為僅安全連接傳輸的cookie數據
HTTPONLY:
- 默認瀏覽器存儲的cookie是可以被其他腳本所處理的
- 設置為true表示僅僅在http請求中使用(建議,該屬性設置為true)
setCookie(‘is_click‘, ‘true‘, time()+3600*24*30, ‘/‘, ‘.kongciyuan.com‘, false, true);
修改cookie
setCookie(KEY, 新VALUE, 新[有效期(時間戳表示)], 新[有效路徑], 新[有效域], 新[是否僅安全傳輸], 新[HTTPONLY])
setCookie(‘is_click‘, ‘false‘, time()+3600*24*30, ‘/‘, ‘.kongciyuan.com‘, false, true);
刪除cookie
標準做法:setCookie(‘KEY, ‘‘, time()-1)
還可以使用:setCookie(KEY, ‘‘)或setCookie(KEY)
獲取cookie
使用超全局數組變量:$_COOKIE
瀏覽器在向服務器發送請求時,會檢測cookie的是否有效,只有沒有過有效期的cookie數據請求時,才會攜帶。
SESSION
將數據存儲在服務器端,瀏覽器只儲存sessionid
開啟session機制
使用session_starat();函數,或在php.ini中設置session.auto_start = 1自動開啟session
==session_start()函數前不應該有輸出==
增,刪,改,查SESSION
通過對$_SESSION數組操作就完成對SESSION的操作。
- 增:$_SESSION[‘user‘] = ‘root‘;
- 刪(不完全):unset($_SESSION[‘user‘]);
- 改:$_SESSION[‘user‘] = ‘admin‘;
- 查:var_dump($_SESSION[‘user‘]);
完全整刪除session全部數據:
//數據區,$_SESSION全局數組,存sessionid的cookie
Session_destroy();
unset($_SESSION);
setCookie(session_name(), ‘‘, time()-1);
清空session數據:
不要:unset($_SESSION);
使用:$_SESSION = array();
session屬性
session屬性特征由瀏覽器的cookie中存儲的sessionid決定
- 在php.ini中配置
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_secure =
session.cookie_httponly =
- 在腳本中,使用函數ini_set()來進行配置的修改
- (推薦)使用函數session_set_cookie_params(有效期, 有效路徑, 有效域, 是否僅安全傳輸, 是否HTTPONLY)
session銷毀
使用函數session_destroy():刪除當前session對應的數據區,關閉session機制(關閉session機制後,余下的session操作都不處理)
session銷毀只將持久化的session清除了,$_SESSION變量是不會自動消失的。
重寫session的存儲機制
註意:
- 先執行session_set_save_handler()再執行session_start()
- 保證session不自動開啟(可以通過.htaccess配置:php_flag session.auto_start = 0)
- 配置session存儲機制為用戶自定義(默認是files):session.save_handler = user
示例:
<?php
//配置session存儲機制
ini_set(‘session.save_handler‘, ‘user‘);
//設置session處理器
//session_set_save_handler(開始函數, 結束函數, 讀函數, 寫函數, 刪除函數, 垃圾回收函數)
session_set_save_handler(
‘userSessionBegin‘,
‘userSessionEnd‘,
‘userSessionRead‘,
‘userSessionWrite‘,
‘userSessionDelete‘,
‘userSessionGC‘
);
echo ‘start‘.‘</br>‘;
session_start();//執行userSessionBegin,userSessionRead
echo ‘</br>‘.‘set‘.‘</br>‘;
$_SESSION[‘user‘] = ‘root‘;//沒有使用函數
echo ‘</br>‘.‘get‘.‘</br>‘;//沒有使用函數
$_SESSION[‘user‘];
echo ‘</br>‘.‘del‘.‘</br>‘;
session_destroy();//使用session_destroy()執行userSessionDelete,否則執行userSessionWrite
function userSessionBegin() {
echo ‘userSessionBegin‘.‘</br>‘;
}
function userSessionEnd() {
echo ‘userSessionEnd‘.‘</br>‘;
}
function userSessionRead() {
echo ‘userSessionRead‘.‘</br>‘;
}
function userSessionWrite() {
echo ‘userSessionWrite‘.‘</br>‘;
}
function userSessionDelete() {
echo ‘userSessionDelete‘.‘</br>‘;
}
function userSessionGC() {
/*
概率分子:session.gc_probability = 1
概率分母:session.gc_divisor = 1000
session最長時間:session.gc_maxlifetime = 1800
*/
echo ‘userSessionGC‘.‘</br>‘;
}
PHP-會話技術