session和cookie都是會話控制思想的體現(xiàn),即:允許服務(wù)器跟蹤同一客戶端的連續(xù)請求盖文。
cookie是什么嘱蛋?
是將使用者的資料記錄存放在客戶端的技術(shù)。
cookie運(yùn)行原理五续?
首先:服務(wù)器 通過http的響應(yīng)頭 把用戶的信息 以鍵值對的形式發(fā)送到客戶端
然后:當(dāng)客戶端再次訪問同一臺服務(wù)器其他的腳本時洒敏,會自動攜帶cookie中的信息通過http請求頭傳送給服務(wù)器
最后:服務(wù)器接收到信息,重新對登陸者身份進(jìn)行驗(yàn)證
cookie包含了什么疙驾?
cookie包括名字凶伙,值,域它碎,路徑函荣,過期時間。
路徑和域構(gòu)成cookie的作用范圍扳肛。cookie如果不設(shè)置過期時間偏竟,則這個cookie在瀏覽器進(jìn)程 存在時有效,關(guān)閉時銷毀敞峭。如果設(shè)置了過期時間踊谋,則cookie存儲在本地硬盤上,在各瀏覽器進(jìn)程間可以共享旋讹。
怎么設(shè)置cookie殖蚕?
使用php內(nèi)建的setcookie()函數(shù)
setcookie($name,$value,$path,$domain,$source)一共六個參數(shù),一般常用前三個 名字沉迹,值和生存時間睦疫。最后一個source指的是是否僅在安全的https連接時傳送,默認(rèn)false
例:setcookie(‘name’鞭呕,‘tian’蛤育,time()+60*60*24*7,'/test','.baidu.com'瓦糕,‘1’)設(shè)置cookie名為name底洗,值為tian,這個cookie七天后失效咕娄,只在服務(wù)器test目錄下生效亥揖,只在baidu.com的所有子域中生效,僅在安全的連接中才能被設(shè)置
注意:setcookie的第二個參數(shù)只能是字符串或者數(shù)值
怎么刪除cookie圣勒?
第一種方法:setcookie('name')? 省略了別的參數(shù)
第二種方法:setcookie(‘name’费变,'',time()-1)? 把生存時間設(shè)為過期
cookie放哪了?
如果用戶是windows系統(tǒng)圣贸,那么放在了C:\Docunments and Settings\用戶名\Cookies
cookie的形態(tài)挚歧?
cookie可以是單一的,通過setcookie('name','tian') 現(xiàn)在cookie的標(biāo)識符為name
cookie也可以為數(shù)組吁峻,通過setcookie('user[username]','tian') 現(xiàn)在cookie的標(biāo)識符為user[username]昼激,這是一個數(shù)組的下標(biāo)
seesion是什么?
是將使用者的資料記錄存放在服務(wù)器端的技術(shù)锡搜。
session是保存使用者的資料在服務(wù)器系統(tǒng)下,而cookie是將數(shù)據(jù)放在客戶端的計算機(jī)之中對于session來說瞧掺,客戶端僅僅保存服務(wù)器為用戶創(chuàng)建的一個session標(biāo)識符稱為sessionID而在服務(wù)器端保存session變量的值耕餐。sessionID是一個32位的字符串,一般情況下sessionID保存在客戶端的cookie里辟狈。如果禁用cookie肠缔,sessionID可以通過隱藏表單傳遞,也可以通過URL重寫哼转,就是把后綴到url傳遞
session運(yùn)行原理明未?
首先:第一次訪問網(wǎng)站,session_start()函數(shù)創(chuàng)建一個sessionID,通過HTTP響應(yīng)頭發(fā)送到客戶端并保存在cookie中壹蔓,同時也在服務(wù)器端創(chuàng)建一個以sessionID命名的文件趟妥,保存用戶的會話信息
然后:用戶再次訪問網(wǎng)站時,先檢查HTTP請求頭中是否有一個sessionID佣蓉,沒有就創(chuàng)建同上一步披摄,有的話就在服務(wù)器硬盤中搜索與seesionID同名的文件,將會話信息讀出勇凭。
session的使用
在php中必須先調(diào)用session_start()函數(shù)疚膊,開啟session。函數(shù)沒有參數(shù)虾标,如果是基于cookie的session寓盗,使用該函數(shù)之前,不能有任何內(nèi)容的輸出。
啟動完成后傀蚌,接下來就是注冊和讀取session變量基显,都要用過全局?jǐn)?shù)組$_SESSION數(shù)組完成session_start();然后注冊session變量$_SESSION['username'] = "tian";
注意:在$_SESSION['username'] = "tian"賦值的同時也會在sessionID文件中追加信息;當(dāng)用戶再次請求本頁或其他頁面喳张,或者 echo $_SESSION['username'] 续镇,是先從這個用戶的seesionID文件中獲取全部的信息數(shù)據(jù)進(jìn)入到$_SESSION數(shù)組中,感覺起來好像是直接從數(shù)組中獲取得值销部。
注銷變量與銷毀Session
1.session_destroy()結(jié)束當(dāng)前的會話摸航,清空會話中所有資源,但不會釋放session相關(guān)變量
2.? unset($_SESSION['username']);? ? ? ? ? ?? //刪除session中注冊的用戶名變量 unset($_SESSION['password']);? ? ? ? ? ? ? ? ?? ? //刪除刪除session中注冊的密碼變量或者直接$_SESSION = array()? ? 將這個全局?jǐn)?shù)組賦為空
3.setcookie(session_name(),'',time()-3600,'/');??? //刪除客戶端的cookie舅桩,這個第一個參數(shù)session_name是php.ini里設(shè)置的sessionID的cookie標(biāo)識符
Session的自動回收機(jī)制
雖然用戶可以點(diǎn)擊“退出”按鈕退出登錄酱虎,但如果直接關(guān)閉瀏覽器或者斷電的情況下載服務(wù)器端保存的Session文件是不會被刪除的,雖然下次登錄會重新分配一個sessionID擂涛,但是之前的Session文件已經(jīng)成為了垃圾文件读串。
在php.ini中使用session.gc_maxlifetime選項指定一個時間,例如1440也就是24分鐘后沒有更新修改時間的session文件就會被‘垃圾回收程序’收回撒妈。
垃圾回收程序是在session_start()函數(shù)調(diào)用時啟動的恢暖,如果用戶很多,可能一秒內(nèi)session_start()函數(shù)會調(diào)用N次狰右,每次都要垃圾回收的話是不合理的杰捂。
可以在php.ini中修改session.gc_probability/session.gc_divisor公式計算概率例如1/100,前者設(shè)為1,后者設(shè)為100棋蚌。
自定義Session處理方式
session默認(rèn)在web服務(wù)器中存儲會話信息嫁佳,但是如果用戶量特別大的情況下,文件I/0開銷會很大谷暮,嚴(yán)重影響效率蒿往,最主要的是不能跨服務(wù)器, 對于大系統(tǒng)一般都會使用多臺服務(wù)器進(jìn)行并發(fā)處理湿弦,這樣就不能達(dá)到跟蹤用戶的目的瓤漏。 ——需要我們改變session存儲方式:
1.使用NFS或者SAMBA共享技術(shù)保存在其他服務(wù)器中。 2.使用數(shù)據(jù)庫保存session信息颊埃。??? 3.(最優(yōu))使用memcache緩存技術(shù)存儲赌蔑。
不論使用哪種方式原理都是一樣的,使用php中的session_set_save_handler()函數(shù)處理:該函數(shù)六個必選參數(shù)竟秫,分別代表了session聲明周期的六個過程