會話技術
由於HTTP協議是無連接無狀態的,所以HTTP協議無法記住客戶端的信息,爲了彌補HTTP協議這兩點的“不足”,所以出現了會話技術
cookie技術
1.什麼是cookie
服務器端,將能夠唯一標示用戶的數據保存客戶端的一種方式。之後瀏覽器在每次請求時都會自動攜帶給服務器
2.cookie的工作原理
3.設置cookie
(1). 設置cookie
setcookie(name,value,expire,path,domain,httponly,secure)
參數 | 說明 |
---|---|
name | cookie名 |
value | cookie值 |
expire | 過期時間,以秒爲單位,以時間原點爲起點(1970年1月1日) |
path | cookie在瀏覽器端顯示的路徑 |
domain | 域 |
secure | true或false |
httponly | true或false |
位於客戶端的cookie的本質就是文本文件
(2). cookie的有效時間
setcookie(name,value,expire);
expire是用於設置cookie的過期時間,時間是以秒記錄的,有效期的起點是時間原點
如果省略表示會話cookie,有效期到瀏覽器關閉。
(3). cookie的路徑
首先明確:PHP有自己位於服務器上的路徑
cookie也有自己的路徑
默認如果在設置cookie時沒有設置參數,那麼cookie的路徑默認就是PHP文件的路徑
setcookie(name,value,expire,path);
path 也有設置cookie在瀏覽器顯示的路徑
如果客戶端的cookie顯示路徑是所請求的PHP文件路徑的父路徑則會攜帶過去,但是絕大多數情況我們是將一個cookie設置爲整站有效
(4). cookie的域
理解域名: | 說明 |
---|---|
頂級域名 | 主要是標示國家 |
- | .cn .us .jp |
一級域名 | 主要是標識行業 |
.com | 商業機構 |
.gov | 政府機構 |
.org | 非盈利組織 |
.edu | 教育機構 |
.net | 網絡機構 |
.mil | 軍事機構 |
二級域名 | 主要用於標識公司 |
– | baidu qq 163 |
cookie所實現的跨域,只能是二級域名相同
(5). secure
setcookie(name,value,expire,path,domain,secure);
secure取值爲true或false
如果設置爲true,那麼只要當客戶端使用的協議是HTTPS時,纔會會將cookie攜帶給服務器端。
https(更安全)=http+ssl
(6). httponly
setcookie(name,value,expire,path,domain,secure,httponly);
httponly取值爲true或false
如果設置爲true,那麼只能由PHP訪問cookie,js不能訪問
4.讀取cookie
$_COOKIE 就是一個關聯數組,主要是用於存儲用戶端通過cookie的技術,提交的數據
5.刪除cookie
方法1:再設置一次cookie,有效期設置爲過期時間
setcookie('name','air jordan',time()-1);
方法2:將cookie的值設置爲字符空
setcookie('name','');
6.關於cookie值的類型
由於cookie的值最終是保存在客戶端的文本文件中,由於文本文件中只能存儲字符,所以cookie不能存儲數組。
如果想存儲數組,可以使用變通的方式
$arr=['PG'=>'irving','SG'=>'T-mac','SF'=>'Lebron','PF'=>'Yi','C'=>'Yao'];
setcookie('PG',$arr['PG']);
setcookie('SG',$arr['SG']);
setcookie('SF',$arr['SF']);
setcookie('PF',$arr['PF']);
setcookie('C',$arr['C']);
echo '<pre>';
print_r($_COOKIE);
session技術
1.什麼是session技術
session也是會話技術中的一種,session是以cookie爲基礎,將重要的數據保存在服務器端,同時將能夠唯一標識這份數據的數據以cookie保存客戶端
2.session原理
3.開啓session
session_start();
用於開啓session機制。同時激活$_SESSION預定義變量
4.session操作——設置session
session的操作就是向_SESSION變量中寫數據時,$_SESSION變量中數據最終會保存到硬盤的一個文本文件中
5.session操作——讀取session
當我們從$_SESSION變量中讀取數據時,其實就是將硬盤那個session文件中的數據提取到內存中
**理解:_SESSION內存變量中的數據寫入到session文件中
其後各次:
請求時,服務器會收到客戶端的cookie中保存的session文件名,同時會在硬盤中找到對應的session文件。
然後打開這個session文件,將文件中的數據讀取到$_SESSION變量
6.session操作——獲取session ID
session_id();
用於獲取當前session id值
7.session數據
session可以存儲任何類型的數據,但是$_SESSION變量本身的下標必須是字符串
8.銷燬session
函數 | 說明 |
---|---|
session_destroy(); | 銷燬session文件 |
unset($_SESSION[下標]); | 銷燬session中部分文件 |
session_start();
$userinfo=['id'=>34,'u_name'=>'admin','u_pwd'=>'123'];
$_SESSION['id']=$userinfo['id'];
$_SESSION['u_name']=$userinfo['u_name'];
$_SESSION['u_pwd']=$userinfo['u_pwd'];
unset($_SESSION['u_name']);
echo '<pre>';
print_r($_SESSION);
9.session配置(在文件php.ini中)
(1).用於設置保存session數據的介質,是文件還是數據庫(一般用文件)
(2).用於設置包岑sessionid的那個cookie的有效期
(3).設置cookie位於瀏覽器端的顯示路徑
(4).設置保存sessionid的那個cookie的域
(5).設置保存sessionid的那個cookie是否允許PHP文件訪問
(6).設置保存sessionid的那個cookie是否只允許https協議傳遞
(7).設置session文件的保存位置
(8).設置保存sessionid的那個cookie的名
(9).設置是否使用cookie保存sessionid
(10).設置是否僅使用cookie保存sessionid
(11).自動開啓session
設置爲自動後,就不用寫入session_start();
10.session文件分目錄存儲
當項目很大時,會產生數量非常多的session文件,爲了能夠加快session文件的查詢速度,我們可以採用分目錄存儲session文件
1;e:/tmp 表示在e:/tmp目錄下需要創建a-z,0-9位文件夾名的文件夾36個。
2;e:/tmp 表示在e:/tmp目錄下需要創建a-z,0-9位文件夾名的文件夾36個,然後在個文件夾再創建36個文件夾。
11.session垃圾回收機制
session文件可以設置一個有效期。默認(24分鐘)設置如下圖:
垃圾:PHP會認爲過期的session是一個垃圾文件,所以需要刪除,刪除這樣的過期session文件有一個機制,就是session垃圾回收機制
12.cookie是瀏覽器的一個功能,可以被禁止,若被禁止,如何實現session?
(1).設置不僅僅使用cookie保存session
(2).設置可以使用transid保存session數據
(3).設置完後形成過程
PHP在啓動的過程中會檢測到session.use_strans_sid=1,當客戶端請求了某個PHP文件是,session機制會自動查找當前PHP文件中是否有a鏈接,如果有就在url後加?PHPSESSION=當前的sessionid值。