session在PHP中的工作原理是什么-創(chuàng)新互聯(lián)

session在PHP中的工作原理是什么?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括墨竹工卡網(wǎng)站建設(shè)、墨竹工卡網(wǎng)站制作、墨竹工卡網(wǎng)頁(yè)制作以及墨竹工卡網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,墨竹工卡網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶(hù)以成都為中心已經(jīng)輻射到墨竹工卡省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶(hù)的支持與信任!

1.在php中如何操作session:


session_start(); //使用該函數(shù)打開(kāi)session功能

$_SESSION  //使用預(yù)定義全局變量操作數(shù)據(jù)

使用unset($_SESSION['key']) //銷(xiāo)毀一個(gè)session的值

簡(jiǎn)單地操作,一切都是由服務(wù)器實(shí)現(xiàn);由于處理在后臺(tái),一切看起來(lái)也很安全。但是session采用什么樣機(jī)制,又是怎樣被實(shí)現(xiàn),并且如何來(lái)保持會(huì)話(huà)的狀態(tài)的呢?

2.session實(shí)現(xiàn)與工作原理

瀏覽器和服務(wù)器采用http無(wú)狀態(tài)的通訊,為了保持客戶(hù)端的狀態(tài),使用session來(lái)達(dá)到這個(gè)目的。然而服務(wù)端是怎么樣標(biāo)示不同的客戶(hù)端或用戶(hù)呢?

這里我們可以使用生活中的一個(gè)例子,假如你參加一個(gè)晚會(huì),認(rèn)識(shí)了很多人,你會(huì)采取什么方式來(lái)區(qū)分不同的人呢!你可能根據(jù)臉型,也有可能根據(jù)用戶(hù)的名字,

或者人的身份證,即采用一個(gè)獨(dú)一無(wú)二的標(biāo)示。在session機(jī)制中,也采用了這樣的一個(gè)的session_id來(lái)標(biāo)示不同的用戶(hù),不同的是:瀏覽器每次請(qǐng)求都會(huì)帶上

由服務(wù)器為它生成的session_id.

原理很簡(jiǎn)單,假設(shè)你訪問(wèn)網(wǎng)頁(yè)時(shí)就像逛澡堂,第一次進(jìn)去你是沒(méi)有鑰匙的,這個(gè)時(shí)候你交了錢(qián)服務(wù)臺(tái)就分配一把鑰匙給你,你走到哪里都要帶上,因?yàn)檫@是你身份的標(biāo)識(shí),接下來(lái)你用這把鑰匙可以去打開(kāi)一個(gè)專(zhuān)有的儲(chǔ)物柜存儲(chǔ)你的衣物,游完泳,你再用鑰匙去打開(kāi)柜子拿出衣物,最后離開(kāi)游泳池時(shí),把鑰匙歸還,你的這次游泳的過(guò)程就是一次session,或者叫做會(huì)話(huà),在這個(gè)例子中,鑰匙就是session的key,而儲(chǔ)物柜可以理解為存儲(chǔ)用戶(hù)會(huì)話(huà)信息的介質(zhì)。

那么在web server中如何實(shí)現(xiàn)session呢?想必看了上面的例子你會(huì)很容易理解,主要是解決兩個(gè)問(wèn)題,一個(gè)是鑰匙的問(wèn)題,一個(gè)是存儲(chǔ)用戶(hù)信息的問(wèn)題。對(duì)于第一個(gè)問(wèn)題,即什么東西可以讓你每次請(qǐng)求都會(huì)自動(dòng)帶到服務(wù)器呢?如果你比較了解http協(xié)議,那么答案一目了然,就是cookie,如果你想為用戶(hù)建立一次會(huì)話(huà),可以在用戶(hù)授權(quán)成功時(shí)給他一個(gè)cookie,叫做會(huì)話(huà)id,它當(dāng)然是的,比如php就會(huì)為建立會(huì)話(huà)的用戶(hù)默認(rèn)set一個(gè)名為phpsessid,值看起來(lái)為一個(gè)隨機(jī)字符串的cookie,如果下次發(fā)現(xiàn)用戶(hù)帶了這個(gè)cookie,服務(wù)器就知道,哎呀,剛剛這位顧客來(lái)了。

剩下的是解決第二個(gè)問(wèn)題,即如何存儲(chǔ)用戶(hù)的信息,服務(wù)器知道會(huì)話(huà)id為abc的用戶(hù)來(lái)了,那abc想存儲(chǔ)自己的私人信息,比如購(gòu)物車(chē)信息,如何處理?這個(gè)時(shí)候可以用內(nèi)存、也可以用文件,也可以用數(shù)據(jù)庫(kù)了,但有個(gè)要求是,數(shù)據(jù)需要用用戶(hù)的會(huì)話(huà)id即可取到,比如php就默認(rèn)會(huì)把會(huì)話(huà)id為abc的用戶(hù)會(huì)話(huà)數(shù)據(jù)存儲(chǔ)到/tmp/phpsess_abc的文件里面,每次讀取都要反序列化程序可以理解的數(shù)據(jù),寫(xiě)的時(shí)候又需要序列化為持久的數(shù)據(jù)格式。

較好理解的描述:


session被用于表示一個(gè)持續(xù)的連接狀態(tài),在網(wǎng)站訪問(wèn)中一般指代客戶(hù)端瀏覽器的進(jìn)程從開(kāi)啟到結(jié)束的過(guò)程。session其實(shí)就是網(wǎng)站分析的訪問(wèn)(visits)度量,表示一個(gè)訪問(wèn)的過(guò)程。


session的常見(jiàn)實(shí)現(xiàn)形式是會(huì)話(huà)cookie(session cookie),即未設(shè)置過(guò)期時(shí)間的cookie,這個(gè)cookie的默認(rèn)生命周期為瀏覽器會(huì)話(huà)期間,只要關(guān)閉瀏覽器窗口,cookie就消失了。實(shí)現(xiàn)機(jī)制是當(dāng)用戶(hù)發(fā)起一個(gè)請(qǐng)求的時(shí)候,服務(wù)器會(huì)檢查該請(qǐng)求中是否包含sessionid,如果未包含,則系統(tǒng)會(huì)創(chuàng)造一個(gè)名為JSESSIONID的輸出 cookie返回給瀏覽器(只放入內(nèi)存,并不存在硬盤(pán)中),并將其以HashTable的形式寫(xiě)到服務(wù)器的內(nèi)存里面;當(dāng)已經(jīng)包含sessionid是,服務(wù)端會(huì)檢查找到與該session相匹配的信息,如果存在則直接使用該sessionid,若不存在則重新生成新的 session。這里需要注意的是session始終是有服務(wù)端創(chuàng)建的,并非瀏覽器自己生成的?!〉菫g覽器的cookie被禁止后session就需要用get方法的URL重寫(xiě)的機(jī)制或使用POST方法提交隱藏表單的形式來(lái)實(shí)現(xiàn)。

簡(jiǎn)單介紹一下流程:當(dāng)客戶(hù)端訪問(wèn)服務(wù)器時(shí),服務(wù)器根據(jù)需求設(shè)置session,將會(huì)話(huà)信息保存在服務(wù)器上,同時(shí)將標(biāo)示session的session_id傳遞給客戶(hù)端瀏覽器,

瀏覽器將這個(gè)session_id保存在內(nèi)存中(還有其他的存儲(chǔ)方式,例如寫(xiě)在url中),我們稱(chēng)之為無(wú)過(guò)期時(shí)間的cookie。瀏覽器關(guān)閉后,這個(gè)cookie就清掉了,它不會(huì)存在用戶(hù)的cookie臨時(shí)文件。

以后瀏覽器每次請(qǐng)求都會(huì)額外加上這個(gè)參數(shù)值,再服務(wù)器根據(jù)這個(gè)session_id,就能取得客戶(hù)端的數(shù)據(jù)狀態(tài)。

如果客戶(hù)端瀏覽器意外關(guān)閉,服務(wù)器保存的session數(shù)據(jù)不是立即釋放,此時(shí)數(shù)據(jù)還會(huì)存在,只要我們知道那個(gè)session_id,就可以繼續(xù)通過(guò)請(qǐng)求獲得此session的信息;但是這個(gè)時(shí)候后臺(tái)的session還存在,但是session的保存有一個(gè)過(guò)期

時(shí)間,一旦超過(guò)規(guī)定時(shí)間沒(méi)有客戶(hù)端請(qǐng)求時(shí),他就會(huì)清除這個(gè)session。

下面介紹一下session的存儲(chǔ)機(jī)制,默認(rèn)的session是保存在files中,即以文件的方式保存session數(shù)據(jù)。在php中主要根據(jù)php.ini的配置session.save_handler

來(lái)選擇保存session的方式。

這里順便說(shuō)明一下,如果要做服務(wù)器的lvs,即多臺(tái)server的話(huà),我們一般使用memcached的方式session,否則會(huì)導(dǎo)致一些請(qǐng)求找不到session。

一個(gè)簡(jiǎn)單的memcache配置:

session.save_handler = memcache

session.save_path = "tcp://10.28.41.84:10001"

當(dāng)然如果一定要使用files文件緩存,我們可以將文件作nfs

,將所有的保存session文件定位到一個(gè)地方。

剛才講返回給用戶(hù)的session-id最終保存在內(nèi)存中,這里我們也可以設(shè)置參數(shù)將其保存在用戶(hù)的url中。

3.實(shí)例問(wèn)題

現(xiàn)有系統(tǒng)A,B; 假設(shè)A系統(tǒng)是可以獨(dú)立運(yùn)行的web系統(tǒng),即可以和瀏覽器直接處理session, B系統(tǒng)是基于mobile的,需要調(diào)用A系統(tǒng)的功能接口,

在保持A不改變的情況下,即登陸驗(yàn)證,session存儲(chǔ)都不變的情況下,B系統(tǒng)能處理前端用戶(hù)的請(qǐng)求。

這里提供的方案是使用PHP實(shí)現(xiàn)

在用戶(hù)登陸成功后,將保存的session的session-id返回給B系統(tǒng),然后B系統(tǒng)每次請(qǐng)求其他接口都帶session_id。

A系統(tǒng)在session_start前加上session_id(session_id);

這樣B系統(tǒng)就能安全的調(diào)用A

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,的支持。

網(wǎng)頁(yè)題目:session在PHP中的工作原理是什么-創(chuàng)新互聯(lián)
當(dāng)前URL:http://bm7419.com/article48/cesohp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃ChatGPT、網(wǎng)頁(yè)設(shè)計(jì)公司、云服務(wù)器、網(wǎng)站制作、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)