四、PHP基础——会话技术Cookie 和 Session
會話技術初步認識
會話技術介紹
web會話可簡單理解為:用戶開一個瀏覽器,訪問某一個web站點,在這個站點點擊多個超鏈接,訪問服務器多個web資源,然后關閉瀏覽器,整個過程稱之為一個會話。
HTTP協(xié)議的特點是無狀態(tài)/無連接,當一個瀏覽器連續(xù)多次請求同一個web服務器時,服務器是無法區(qū)分多個操作是否來自于同一個瀏覽器(用戶)。會話技術就是通過HTTP協(xié)議想辦法讓服務器能夠識別來自同一個瀏覽器的多次請求,從而方便瀏覽器(用戶)在訪問同一個網站的多次操作中,能夠持續(xù)進行而不需要進行額外的身份驗證。
會話技術分類
1)cookie技術
Cookie 是在 HTTP 協(xié)議下,服務器或腳本可以維護客戶工作站上信息的一種方式。Cookie 是由 Web 服務器保存在用戶瀏覽器(客戶端)上的小文本文件(HTTP協(xié)議響應頭),它可以包含有關用戶的信息。無論何時用戶鏈接到服務器(HTTP請求攜帶數據),Web 站點都可以訪問 Cookie 信息
2)session技術
Session直接翻譯成中文比較困難,一般都譯成時域。在計算機專業(yè)術語中,Session是指一個終端用戶與交互系統(tǒng)進行通信的時間間隔,通常指從注冊進入系統(tǒng)到注銷退出系統(tǒng)之間所經過的時間。以及如果需要的話,可能還有一定的操作空間。Session技術是將數據保存到服務器端,無論何時用戶鏈接到服務器,Web站點都可以訪問Session信息:SESSION技術的實現(xiàn)是依賴COOKIE技術的。
兩種會話技術區(qū)別
1)安全性方面
a)Session存儲服務器端,安全性高
b)Cookie存儲瀏覽器端,安全性低
2)數據大小方面
a)Cookie的數量和大小都有限制(20個/4K)
b)Session數據存儲不限
3)可用數據類型
a)Cookie只能存儲簡單數據,數值/字符串
b)Session可以存儲復雜數據(自動序列化)
4)保存位置方面
a)Cookie保存在瀏覽器上
b)Session保存在服務器上
COOKIE的基本使用
COOKIE原理
COOKIE技術:服務器將數據通過HTTP響應存儲到瀏覽器上,瀏覽器可以在以后攜帶對應的COOKIE數據訪問服務器。
設置COOKIE信息
Setcookie函數用來設定COOKIE信息
Setcookie(名字,值)
1)cookie名的設置:字符串,第一個參數
2)cookie值的設置:第二個參數
3)cookie值的類型要求:必須是簡單類型中的整數或者字符串
讀取COOKIE信息
1)$_COOKIE數組的使用
COOKIE(會話技術)能夠實現(xiàn)跨腳本共享數據
COOKIE高級使用
COOKIE生命周期
COOKIE生命周期:COOKIE在瀏覽器生存時間(瀏覽器在下次訪問服務器的時候是否攜帶對應的COOKIE)
1)默認(不設定)時的生命周期:不設定周期默認是關閉瀏覽器(會話結束)
2)設定為一個常規(guī)日期戳的周期:通過setcookie第三個參數可以限定生命周期,是用時間戳來管理,從格林威治時間開始
瀏覽器關閉后重新查看
3)設定為“0”的周期:在第三個參數設定生命周期的時候,用0代替時間戳:表示就是普通設置,會話結束過期
4)刪除一個cookie的做法:服務器沒有權限去操作瀏覽器上的內容(不可能刪除)。可以通過設定生命周期來讓瀏覽器自動判定COOKIE是否有效:無效就清除
4.1 清空COOKIE數據內容
4.2 設定時間戳過期
COOKIE作用范圍
作用范圍:不同的文件夾層級中,設定的COOKIE默認是在不同的文件夾下有訪問限制。上層文件夾中設定的COOKIE可以在下層(子文件夾)中訪問,而子文件夾中設定的COOKIE不能在上層文件夾中訪問。
1)默認(不設定)的范圍:就是使用COOKIE默認的作用范圍
2)設定為“/”的含義:告知瀏覽器當前COOKIE的作用范圍是網站根目錄
Setcookie(名字,值,生命周期,作用范圍)
COOKIE跨子域
跨子域:在同一級別域名下,myitcast.com(一級域名),可以有多個子域名(www.myitcast.com和gz.myitcast.com),他們之間是搭建在不同的服務器上(不同文件夾:E:/server/apache/htdocs和E:/web),但是可以通過COOKIE設置實現(xiàn)對應的COOKIE共享訪問。但是默認是不允許跨域名訪問的。
1)設定cookie的有效域名:不同的域名(包含主機)之間不能共享COOKIE
可以通過setcookie的第五個參數來控制
Setcookie(名字,值,生命周期,作用范圍,有效域名)
2)不設定時的默認有效域名
3)跨子域的設定方法:在設定域名訪問的時候用設定上級域名即可:myitcast.com,這個是有所有以myitcast.com結尾的網站都可以共享COOKIE
COOKIE數組數據
COOKIE本身只支持簡單數據(數字或者字符串),能夠保留的數據本身有限,也不成體系。如果需要使用COOKIE來保留一組數據的化,想辦法湊成數組。(COOKIE不支持數組)
1)設置形式:setcookie(‘c1[k1]’, 值)
2)讀取形式:$_COOKIE[‘c1’][‘k1’]
SESSION基本使用
SESSION原理
Session與瀏覽器無關,但是與Cookie有關。
1、PHP碰到session_start()時開啟session會話,會自動檢測sessionID
a)如果Cookie中存在,使用現(xiàn)成的
b)如果Cookie中不存在,創(chuàng)建一個sessionID,并通過響應頭以Cookie形式保存到瀏覽器上
2、初始化超全局變量SESSION為一個空數組3、PHP通過sessionID去指定位置(session文件存儲位置)匹配對應的文件a)不存在該文件:創(chuàng)建一個sessionID命名文件b)存在該文件:讀取文件內容(反序列化),將數據存儲到_SESSION為一個空數組 3、PHP通過sessionID去指定位置(session文件存儲位置)匹配對應的文件 a)不存在該文件:創(chuàng)建一個sessionID命名文件 b)存在該文件:讀取文件內容(反序列化),將數據存儲到S?ESSION為一個空數組3、PHP通過sessionID去指定位置(session文件存儲位置)匹配對應的文件a)不存在該文件:創(chuàng)建一個sessionID命名文件b)存在該文件:讀取文件內容(反序列化),將數據存儲到_SESSION中
4、腳本執(zhí)行結束,將$_SESSION中保存的所有數據序列化存儲到sessionID對應的文件中
SESSION基本使用
啟用session,任何時候都需要開啟session(腳本使用到$_SESSION就開啟一次)
$_SESSION是通過session_start()函數的調用才會定義的,沒有直接定義
Session使用需要開啟session_start
設置SESSION信息
如果想存儲數據到session中,那么只要不斷給$_SESSION數組添加元素即可
讀取SESSION信息
$_SESSION就是一個數組,存儲什么數據,什么方式存的,就是可以通過什么方式訪問什么數據
會話技術的本質是為了實現(xiàn)跨腳本共享數據:在一個腳本中定義數據,在另外一個腳本中保存數據
SESSION基本使用
刪除session就是將session數據清理掉(SESSION拿不到)刪除一個SESSION信息Unset(_SESSION拿不到) 刪除一個SESSION信息 Unset(S?ESSION拿不到)刪除一個SESSION信息Unset(_SESSION[元素下標])刪除指定session數據
刪除全部SESSION信息
刪除全部數據就是讓$_SESSION變成一個空數組
SESSION基本使用
SESSION相關配置
SESSION基礎配置
1)session.name:session名字,保存到COOKIE中sessionID對應的名字
2)session.auto_start:是否自動開啟session(無需手動session_start()),默認是關閉的
3)session.save_handler:session數據的保存方式,默認是文件形式
4)session.save_path:session文件默認存儲的位置
使用系統(tǒng)的文件夾存儲不安全,需要指定對應存儲路徑
SESSION常用配置
1)session.cookie_lifetime:PHPsessionID在瀏覽器端對應COOKIE的生命周期,默認是會話結束
2)session.cookie_path:sessionID在瀏覽器存儲之后允許服務器訪問的路徑(COOKIE有作用范圍)
3)session.cookie_domain:COOKIE允許訪問的子域(COOKIE可以跨子域)
配置的兩種形式
1)php.ini中配置:全局配置,修改php.ini中的配置項
2)腳本中配置:PHP可以通過ini_set函數來在運行中設定某些配置項(只會對當前運行的腳本有效),把這種配置稱之為項目級
@Ini_set(‘session.save_path’,’E:/server/sessions’);
SESSION基本使用
Session刪除是指刪除session數據,$_SESSION中看不到而已;銷毀session是指刪除session對應的session文件。
銷毀SESSION
系統(tǒng)提供一個函數:session_destroy(),會自動根據session_start得到的sessionID去找到指定的session文件,并把其刪除。
SESSION基本使用
SESSION垃圾回收機制
垃圾回收機制原理
session會話技術后,session文件并不會自動清除,如果每天有大量session文件產生但是又都是失效的,會增加服務器的壓力和影響session效率。
垃圾回收,是指session機制提供了一種解決垃圾session文件的方式:給session文件指定周期,通過session文件最后更改時間與生命周期進行結合判定,如果已經過期則刪除對應的session文件,如果沒有過期則保留。這樣就可以及時清理無效的僵尸文件,從而提升空間利用率和session工作效率。
1、任何一次session開啟(session_start),session都會嘗試去讀取session文件
2、讀取session文件后,有可能觸發(fā)垃圾回收機制(在session系統(tǒng)中也是一個函數:自己有一定幾率調用)
3、垃圾回收機制會自動讀取所有session文件的最后編輯時間,然后加上生命周期(配置文件)與當前時間進行比較(所有session文件)
a)過期:刪除
b)有效:保留
垃圾回收參數設置
1)session.gc_maxlifetime = 1440:規(guī)定的session文件最大的生命周期是1440秒,24分鐘
2)session.gc_probability = 1:垃圾回收概率因子(分子)
3)session.gc_divisor = 1000:垃圾回收概率分母
默認的觸發(fā)概率是1/1000
測試垃圾回收效果:
1、 修改生命周期為2分鐘,120秒
2、 修改觸發(fā)幾率:100%
SESSION基本使用
禁用COOKIE后如何使用SESSION
禁用COOKIE不能使用SESSION原因
Session技術需要利用到COOKIE技術來保存sessionID,從而使得PHP能夠在跨腳本的時候得到相同的sessionID,從而訪問同一個session文件。
解決思路:最終讓session_start在開啟之前拿到原來的sessionID(另外一個腳本的)
實現(xiàn)無COOKIE使用SESSION
在PHP中,想要解決沒有COOKIE也實現(xiàn)session技術的方式有兩種:
方案1:可以利用PHP提供的session函數:session_id和session_name來獲得和設置sessionID或者name從而解決session_start產生新sessionID的情況(手動操作):
1、 在session保存數據的腳本中獲取sessionID和名字
2、 想辦法將數據傳遞給另外一個腳本:表單傳值(URL或者form表單)
3、 在需要使用到session的腳本中,先接收數據
4、 組織session_start產生新的ID,告訴它已經存在:session_id($id)
方案2:可以利用session集中已經提供的解決方案自動操作(配置)
原因1:默認session配置只允許使用COOKIE保存sessionID:cookie_ony
原因2:默認關閉了其他能夠傳送數據的方式,只保留了COOKIE
1、 修改PHP配置文件,開啟其他方式傳輸sessionID,關閉只允許使用COOKIE傳輸功能
2、 一旦配置開啟,PHP會自動將sessionID和session名字在其他位置綁定數據,同時還會在session_start的時候,考慮其他方式傳遞(表單)的數據,而不是只有COOKIE
總結
以上是生活随笔為你收集整理的四、PHP基础——会话技术Cookie 和 Session的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS高级——错误处理
- 下一篇: 动态规划算法php,php算法学习之动态