国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > PHP > 正文

解析php中session的實(shí)現(xiàn)原理以及大網(wǎng)站應(yīng)用應(yīng)注意的問題

2024-05-04 23:09:50
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

PHP SESSION原理
我們知道,session是在服務(wù)器端保持用戶會(huì)話數(shù)據(jù)的一種方法,對(duì)應(yīng)的cookie是 在客戶端保持用戶數(shù)據(jù)。HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議,服務(wù)器響應(yīng)完之后就失去了與瀏覽器的聯(lián)系,最早,Netscape將cookie引入瀏覽器,使得 數(shù)據(jù)可以客戶端跨頁(yè)面交換,那么服務(wù)器是如何記住眾多用戶的會(huì)話數(shù)據(jù)呢?

首先要將客戶端和服務(wù)器端建立一一聯(lián)系,每個(gè)客戶 端都得有一個(gè)唯一標(biāo)識(shí),這樣服務(wù)器才能識(shí)別出來(lái)。建議唯一標(biāo)識(shí)的方法有兩種:cookie或者通過(guò)GET方式指定。默認(rèn)配置的PHP使用session的 時(shí)會(huì)建立一個(gè)名叫”PHPSESSID”的cookie(可以通過(guò)php.ini修改session.name值指定),如果客戶端禁用cookie,你 也可以指定通過(guò)GET方式把session id傳到服務(wù)器(修改php.ini中session.use_trans_sid等參數(shù))。

我們查看服務(wù)器端session.save_path目錄會(huì)發(fā)現(xiàn)很多類似sess_vv9lpgf0nmkurgvkba1vbvj915這樣的文件,這個(gè) 其實(shí)就是session id “vv9lpgf0nmkurgvkba1vbvj915″對(duì)應(yīng)的數(shù)據(jù)。真相就在這里,客戶端將session id傳遞到服務(wù)器,服務(wù)器根據(jù)session id找到對(duì)應(yīng)的文件,讀取的時(shí)候?qū)ξ募?nèi)容進(jìn)行反序列化就得到session的值,保存的時(shí)候先序列化再寫入。

事實(shí)就是這 樣,所以如果服務(wù)器不支持session或者你想自定義session,完全可以DIY,通過(guò)PHP的uniqid生成永不重復(fù)的session id,然后找個(gè)地方存儲(chǔ)session的內(nèi)容即可,你也可以學(xué)flickr把session存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)中。

使用session之前為什么必須先執(zhí)行session_start()?
了 解的原理之后,所謂的session其實(shí)就是客戶端一個(gè)session id服務(wù)器端一個(gè)session file,新建session之前執(zhí)行session_start()是告訴服務(wù)器要種一個(gè)cookie以及準(zhǔn)備好session文件,要不然你的 session內(nèi)容怎么存;讀取session之前執(zhí)行session_start()是告訴服務(wù)器,趕緊根據(jù)session id把session文件反序列化。

只有一個(gè)session函數(shù)可以在session_start()之前執(zhí)行,session_name():讀取或指定session名稱(比如默認(rèn)的就是”PHPSESSID”),這個(gè)當(dāng)然要在session_start之前執(zhí)行。

session影響系統(tǒng)性能
session 在大訪問量網(wǎng)站上確實(shí)影響系統(tǒng)性能,影響性能的原因之一由文件系統(tǒng)設(shè)計(jì)造成,在同一個(gè)目錄下超過(guò)10000個(gè)文件時(shí),文件的定位將非常耗時(shí),PHP支持 session目錄hash,我們可以通過(guò)修改php.ini中session.save_path = “2;/path/to/session/dir”,那么session將存儲(chǔ)在兩級(jí)子目錄中,每個(gè)目錄有16個(gè)子目錄[0~f],不過(guò)好像PHP session不支持創(chuàng)建目錄,你需要事先把那么些目錄創(chuàng)建好 。

還有一個(gè)問題就是小文件的效率問題,一般我們的 session數(shù)據(jù)都不會(huì)太大(1~2K),如果有大量這樣1~2K的文件在磁盤上,IO效率肯定會(huì)很差,PHP手冊(cè)上建議使用Reiserfs文件系 統(tǒng),不過(guò)Reiserfs的前景堪憂,Reiserfs的作者把媳婦給殺了,SuSE也拋棄了Reiserfs。

其實(shí)還有很多中 存儲(chǔ)session的方式,可以通過(guò)php -i|grep “Registered save handlers”查看,比如Registered save handlers => files user sqlite eaccelerator可以通過(guò)文件、用戶、sqlite、eaccelerator來(lái)存,如果服務(wù)器裝了memcached,還有會(huì)mmcache的 選項(xiàng)。當(dāng)然還有很多,比如MySQL、PostgreSQL等等。都是不錯(cuò)的選擇。

session的同步
我們前端可能有很多臺(tái)服務(wù)器,用戶在A服務(wù)器上登錄了,種下了session信息,然后訪問網(wǎng)站的某些頁(yè)面沒準(zhǔn)跳到B服務(wù)器上去了,如果這個(gè)時(shí)候B服務(wù)器上沒有session信息又沒有做特殊處理,可能就會(huì)出問題了。
session同步有很多種,如果你是存儲(chǔ)在memcached或者M(jìn)ySQL中,那就很容易了,指定到同樣的位置即可,如果是文件形式的,你可以用NFS統(tǒng)一存儲(chǔ)。

還有一種方式是通過(guò)加密的cookie來(lái)實(shí)現(xiàn),用戶在A服務(wù)器上登錄成功,在用戶的瀏覽器上種上一個(gè)加密的cookie,當(dāng)用戶訪問B服務(wù)器時(shí),檢查有無(wú) session,如果有當(dāng)然沒問題,如果沒有,就去檢驗(yàn)cookie是否有效,cookie有效的話就在B服務(wù)器上重建session。這種方法其實(shí)很有 用,如果網(wǎng)站有很多個(gè)子頻道,服務(wù)器也不在一個(gè)機(jī)房,session沒辦法同步又想做統(tǒng)一登錄那就太有用了。

當(dāng)然還有一種方法就 是在負(fù)載均衡那一層保持會(huì)話,把訪問者綁定在某個(gè)服務(wù)器上,他的所有訪問都在那個(gè)服務(wù)器上就不需要session同步了,這些都是運(yùn)維層面的東西。就說(shuō)這 么多吧,根據(jù)自己的應(yīng)用來(lái)選擇使用session,不要因?yàn)榇蠹叶颊f(shuō)session影響系統(tǒng)性能就畏首畏尾,知道問題,解決問題才是關(guān)鍵,惹不起躲得起不適合這里。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西充县| 辽中县| 大余县| 海宁市| 达州市| 大渡口区| 玉树县| 曲松县| 卢氏县| 崇义县| 平南县| 东港市| 禹城市| 城步| 定陶县| 彩票| 扎兰屯市| 崇信县| 耿马| 任丘市| 吴江市| 宿松县| 平阳县| 碌曲县| 大竹县| 齐齐哈尔市| 保康县| 句容市| 阳城县| 甘谷县| 上蔡县| 林口县| 扎鲁特旗| 舟曲县| 渝北区| 司法| 洛扎县| 罗田县| 莱阳市| 赤壁市| 崇文区|