session和cookie

session和cookie都是會(huì)話控制思想的體現(xiàn),即:允許服務(wù)器跟蹤同一客戶端的連續(xù)請(qǐng)求。


cookie是什么?

將使用者的資料記錄存放在客戶端的技術(shù)。

cookie運(yùn)行原理?

首先:服務(wù)器 通過http的響應(yīng)頭 把用戶的信息 以鍵值對(duì)的形式發(fā)送到客戶端

然后:當(dāng)客戶端再次訪問同一臺(tái)服務(wù)器其他的腳本時(shí),會(huì)自動(dòng)攜帶cookie中的信息通過http請(qǐng)求頭傳送給服務(wù)器

最后:服務(wù)器接收到信息,重新對(duì)登陸者身份進(jìn)行驗(yàn)證

cookie包含了什么?

cookie包括名字,值,域,路徑,過期時(shí)間。

路徑和域構(gòu)成cookie的作用范圍。cookie如果不設(shè)置過期時(shí)間,則這個(gè)cookie在瀏覽器進(jìn)程 存在時(shí)有效,關(guān)閉時(shí)銷毀。如果設(shè)置了過期時(shí)間,則cookie存儲(chǔ)在本地硬盤上,在各瀏覽器進(jìn)程間可以共享。

怎么設(shè)置cookie?

使用php內(nèi)建的setcookie()函數(shù)

setcookie($name,$value,$path,$domain,$source)一共六個(gè)參數(shù),一般常用前三個(gè) 名字,值和生存時(shí)間。最后一個(gè)source指的是是否僅在安全的https連接時(shí)傳送,默認(rèn)false

例:setcookie(‘name’,‘tian’,time()+60*60*24*7,'/test','.baidu.com',‘1’)設(shè)置cookie名為name,值為tian,這個(gè)cookie七天后失效,只在服務(wù)器test目錄下生效,只在baidu.com的所有子域中生效,僅在安全的連接中才能被設(shè)置

注意:setcookie的第二個(gè)參數(shù)只能是字符串或者數(shù)值

怎么刪除cookie?

第一種方法:setcookie('name')? 省略了別的參數(shù)

第二種方法:setcookie(‘name’,'',time()-1)? 把生存時(shí)間設(shè)為過期

cookie放哪了?

如果用戶是windows系統(tǒng),那么放在了C:\Docunments and Settings\用戶名\Cookies

cookie的形態(tài)?

cookie可以是單一的,通過setcookie('name','tian') 現(xiàn)在cookie的標(biāo)識(shí)符為name

cookie也可以為數(shù)組,通過setcookie('user[username]','tian') 現(xiàn)在cookie的標(biāo)識(shí)符為user[username],這是一個(gè)數(shù)組的下標(biāo)


seesion是什么?

將使用者的資料記錄存放在服務(wù)器端的技術(shù)。

session是保存使用者的資料在服務(wù)器系統(tǒng)下,而cookie是將數(shù)據(jù)放在客戶端的計(jì)算機(jī)之中對(duì)于session來說,客戶端僅僅保存服務(wù)器為用戶創(chuàng)建的一個(gè)session標(biāo)識(shí)符稱為sessionID而在服務(wù)器端保存session變量的值。sessionID是一個(gè)32位的字符串,一般情況下sessionID保存在客戶端的cookie里。如果禁用cookie,sessionID可以通過隱藏表單傳遞,也可以通過URL重寫,就是把后綴到url傳遞

session運(yùn)行原理?

首先:第一次訪問網(wǎng)站,session_start()函數(shù)創(chuàng)建一個(gè)sessionID,通過HTTP響應(yīng)頭發(fā)送到客戶端并保存在cookie中,同時(shí)也在服務(wù)器端創(chuàng)建一個(gè)以sessionID命名的文件,保存用戶的會(huì)話信息

然后:用戶再次訪問網(wǎng)站時(shí),先檢查HTTP請(qǐng)求頭中是否有一個(gè)sessionID,沒有就創(chuàng)建同上一步,有的話就在服務(wù)器硬盤中搜索與seesionID同名的文件,將會(huì)話信息讀出。

session的使用

在php中必須先調(diào)用session_start()函數(shù),開啟session。函數(shù)沒有參數(shù),如果是基于cookie的session,使用該函數(shù)之前,不能有任何內(nèi)容的輸出。

啟動(dòng)完成后,接下來就是注冊(cè)和讀取session變量,都要用過全局?jǐn)?shù)組$_SESSION數(shù)組完成session_start();然后注冊(cè)session變量$_SESSION['username'] = "tian";

注意:在$_SESSION['username'] = "tian"賦值的同時(shí)也會(huì)在sessionID文件中追加信息;當(dāng)用戶再次請(qǐng)求本頁或其他頁面,或者 echo $_SESSION['username'] ,是先從這個(gè)用戶的seesionID文件中獲取全部的信息數(shù)據(jù)進(jìn)入到$_SESSION數(shù)組中,感覺起來好像是直接從數(shù)組中獲取得值。

注銷變量與銷毀Session

1.session_destroy()結(jié)束當(dāng)前的會(huì)話,清空會(huì)話中所有資源,但不會(huì)釋放session相關(guān)變量

2.? unset($_SESSION['username']);? ? ? ? ? ?? //刪除session中注冊(cè)的用戶名變量 unset($_SESSION['password']);? ? ? ? ? ? ? ? ?? ? //刪除刪除session中注冊(cè)的密碼變量或者直接$_SESSION = array()? ? 將這個(gè)全局?jǐn)?shù)組賦為空

3.setcookie(session_name(),'',time()-3600,'/');??? //刪除客戶端的cookie,這個(gè)第一個(gè)參數(shù)session_name是php.ini里設(shè)置的sessionID的cookie標(biāo)識(shí)符

Session的自動(dòng)回收機(jī)制

雖然用戶可以點(diǎn)擊“退出”按鈕退出登錄,但如果直接關(guān)閉瀏覽器或者斷電的情況下載服務(wù)器端保存的Session文件是不會(huì)被刪除的,雖然下次登錄會(huì)重新分配一個(gè)sessionID,但是之前的Session文件已經(jīng)成為了垃圾文件。

在php.ini中使用session.gc_maxlifetime選項(xiàng)指定一個(gè)時(shí)間,例如1440也就是24分鐘后沒有更新修改時(shí)間的session文件就會(huì)被‘垃圾回收程序’收回。

垃圾回收程序是在session_start()函數(shù)調(diào)用時(shí)啟動(dòng)的,如果用戶很多,可能一秒內(nèi)session_start()函數(shù)會(huì)調(diào)用N次,每次都要垃圾回收的話是不合理的。

可以在php.ini中修改session.gc_probability/session.gc_divisor公式計(jì)算概率例如1/100,前者設(shè)為1,后者設(shè)為100。

自定義Session處理方式

session默認(rèn)在web服務(wù)器中存儲(chǔ)會(huì)話信息,但是如果用戶量特別大的情況下,文件I/0開銷會(huì)很大,嚴(yán)重影響效率,最主要的是不能跨服務(wù)器, 對(duì)于大系統(tǒng)一般都會(huì)使用多臺(tái)服務(wù)器進(jìn)行并發(fā)處理,這樣就不能達(dá)到跟蹤用戶的目的。 ——需要我們改變session存儲(chǔ)方式:

1.使用NFS或者SAMBA共享技術(shù)保存在其他服務(wù)器中。 2.使用數(shù)據(jù)庫保存session信息。??? 3.(最優(yōu))使用memcache緩存技術(shù)存儲(chǔ)。

不論使用哪種方式原理都是一樣的,使用php中的session_set_save_handler()函數(shù)處理:該函數(shù)六個(gè)必選參數(shù),分別代表了session聲明周期的六個(gè)過程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容