1. 程式人生 > >PHP-會話技術

PHP-會話技術

lse domain 持久化 會話 ams 增刪 最長 連接 同名

B/S請求響應模式是無狀態的。任意的請求間不存在任何的聯系,不能將請求狀態保持下去。
會話技術可以給每個瀏覽器分配持久數據,這些數據不會隨著一次請求和相應結束而銷毀。

COOKIE

cookie是一種允許服務器端腳本在瀏覽器端存儲數據的技術。
cookie特點:

  1. 允許服務器向瀏覽器發送指令,用來管理存儲在瀏覽器端的cookie數據。
  2. 瀏覽器如果存儲了某臺服務器所設置的cookie數據,瀏覽器再向服務器請求時,會攜帶存儲的cookie數據到服務器端。
  3. cookie的有效期,有效路徑等在瀏覽器進行判斷是否發送給服務器端

設置cookie

setCookie(KEY, VALUE, [有效期(時間戳表示)], [有效路徑], [有效域], [是否僅安全傳輸], [HTTPONLY])
==setCookie()前不能存在任何的輸出==

KEY:
設置成數組形式(user[name])在瀏覽器保存時是字符串,獲取時被PHP整理成數組。

有效期:

  1. 0:表示會話周期(默認值)
  2. PHP_INT_MAX:邏輯上表示永久有效的cookie

有效路徑:

  1. 默認在當前路徑及其後代路徑有效(通常設置為‘/‘站點根目錄有效,也就是整站有效)
  2. 這裏的路徑不是代碼所在文件的本地磁盤路徑,而是URL請求的路徑關系
  3. 不同路徑下同名的cookie可以同時存儲於瀏覽器端
  4. 瀏覽器發出請求時,會先查找當前目錄內有效的cookie,再向上查找,將所有有效的邏輯上表示永久有效的cookie都攜帶到服務器端,服務器在形成$_COOKIE時,會出現重寫效果,先出現的保留

有效域:

  1. 默認在當前域下有效。
  2. 通過設置,可以使cookie的有效域擴展到某個一級域名下的所有子域(.domain_name.com)

是否僅安全傳輸:

  1. 默認不論瀏覽器發出的是http還是https都會將有效的cookie攜帶的服務器端
  2. 設置為true表示激活僅安全連接傳輸,此時瀏覽器在向服務器發出請求時,如果請求協議為http,就不會向服務器發送這些設置為僅安全連接傳輸的cookie數據

HTTPONLY:

  1. 默認瀏覽器存儲的cookie是可以被其他腳本所處理的
  2. 設置為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決定

  1. 在php.ini中配置
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_secure =
session.cookie_httponly =
  1. 在腳本中,使用函數ini_set()來進行配置的修改
  2. (推薦)使用函數session_set_cookie_params(有效期, 有效路徑, 有效域, 是否僅安全傳輸, 是否HTTPONLY)

session銷毀

使用函數session_destroy():刪除當前session對應的數據區,關閉session機制(關閉session機制後,余下的session操作都不處理)
session銷毀只將持久化的session清除了,$_SESSION變量是不會自動消失的。

重寫session的存儲機制

註意:

  1. 先執行session_set_save_handler()再執行session_start()
  2. 保證session不自動開啟(可以通過.htaccess配置:php_flag session.auto_start = 0)
  3. 配置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-會話技術