php中session的實現原理以及大網站應用應注意的問題分析
PHP SESSION原理
我們知道,session是在服務器端保持用戶會話數據的一種方法,對應的cookie是 在客戶端保持用戶數據。HTTP協議是一種無狀態協議,服務器響應完之後就失去了與瀏覽器的聯繫,最早,Netscape將cookie引入瀏覽器,使得 數據可以客戶端跨頁面交換,那麼服務器是如何記住衆多用戶的會話數據呢?
首先要將客戶端和服務器端建立一一聯繫,每個客戶 端都得有一個唯一標識,這樣服務器才能識別出來。建議唯一標識的方法有兩種:cookie或者通過GET方式指定。默認配置的PHP使用session的 時會建立一個名叫”PHPSESSID”的cookie(可以通過修改值指定),如果客戶端禁用cookie,你 也可以指定通過GET方式把session id傳到服務器(修改中_trans_sid等參數)。
我們查看服務器端_path目錄會發現很多類似sess_vv9lpgf0nmkurgvkba1vbvj915這樣的文件,這個 其實就是session id “vv9lpgf0nmkurgvkba1vbvj915″對應的數據。真相就在這裏,客戶端將session id傳遞到服務器,服務器根據session id找到對應的文件,讀取的時候對文件內容進行反序列化就得到session的值,保存的時候先序列化再寫入。
事實就是這 樣,所以如果服務器不支持session或者你想自定義session,完全可以DIY,通過PHP的uniqid生成永不重複的session id,然後找個地方存儲session的內容即可,你也可以學flickr把session存儲在MySQL數據庫中。
使用session之前爲什麼必須先執行session_start()?
了 解的原理之後,所謂的session其實就是客戶端一個session id服務器端一個session file,新建session之前執行session_start()是告訴服務器要種一個cookie以及準備好session文件,要不然你的. session內容怎麼存;讀取session之前執行session_start()是告訴服務器,趕緊根據session id把session文件反序列化。
只有一個session函數可以在session_start()之前執行,session_name():讀取或指定session名稱(比如默認的就是”PHPSESSID”),這個當然要在session_start之前執行。
session影響系統性能
session 在大訪問量網站上確實影響系統性能,影響性能的原因之一由文件系統設計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時,PHP支持 session目錄hash,我們可以通過修改中_path = “2;/path/to/session/dir”,那麼session將存儲在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHP session不支持創建目錄,你需要事先把那麼些目錄創建好 。
還有一個問題就是小文件的效率問題,一般我們的 session數據都不會太大(1~2K),如果有大量這樣1~2K的文件在磁盤上,IO效率肯定會很差,PHP手冊上建議使用Reiserfs文件系 統,不過Reiserfs的前景堪憂,Reiserfs的作者把媳婦給殺了,SuSE也拋棄了Reiserfs。
其實還有很多中 存儲session的方式,可以通過php -i|grep “Registered save handlers”查看,比如Registered save handlers => files user sqlite eaccelerator可以通過文件、用戶、sqlite、eaccelerator來存,如果服務器裝了memcached,還有會mmcache的 選項。當然還有很多,比如MySQL、PostgreSQL等等。都是不錯的選擇。
session的同步
我們前端可能有很多臺服務器,用戶在A服務器上登錄了,種下了session信息,然後訪問網站的某些頁面沒準跳到B服務器上去了,如果這個時候B服務器上沒有session信息又沒有做特殊處理,可能就會出問題了。
session同步有很多種,如果你是存儲在memcached或者MySQL中,那就很容易了,指定到同樣的位置即可,如果是文件形式的,你可以用NFS統一存儲。
還有一種方式是通過加密的cookie來實現,用戶在A服務器上登錄成功,在用戶的瀏覽器上種上一個加密的cookie,當用戶訪問B服務器時,檢查有無 session,如果有當然沒問題,如果沒有,就去檢驗cookie是否有效,cookie有效的話就在B服務器上重建session。這種方法其實很有 用,如果網站有很多個子頻道,服務器也不在一個機房,session沒辦法同步又想做統一登錄那就太有用了。
當然還有一種方法就 是在負載均衡那一層保持會話,把訪問者綁定在某個服務器上,他的所有訪問都在那個服務器上就不需要session同步了,這些都是運維層面的東西。就說這 麼多吧,根據自己的應用來選擇使用session,不要因爲大家都說session影響系統性能就畏首畏尾,知道問題,解決問題纔是關鍵,惹不起躲得起不適合這裏。
相關文章
-
PHP中使用session實現保存用戶登錄信息
文章主要給大家介紹在php中是如何使用session實現保存用戶登錄信息的,涉及到php session 用戶登錄等一些知識點,使用session保存用戶登錄信息要比cookie安全很多。感興趣的朋友一起學習吧。session在php中是一個非常重 -
php實現Session存儲到Redis
介紹了php實現Session存儲到Redis的方法,php Session可以保存到文本或者內存、還有數據庫,本文講的是存到Redis的方法.對於大訪問量的站點使用默認的Session 並不合適,我們可以將其存入數據庫、或者使用Redis KEY-VALUE -
Zend studio for eclipse中使php可以調用mysql相關函數的設置方
Zend studio for eclipse中使php可以調用mysql相關函數的設置方法教程如果直接調用mysql_connect會出現:Fatal error: Call to undefined function mysql_connect() 的錯誤解決辦法,找到zend studio 所在的`位置我的zen -
PHP實現多服務器共享SESSION 數據
讀完一本經典名著後,大家心中一定是萌生了不少心得,需要回過頭來寫一寫讀後感了。那要怎麼寫好讀後感呢?以下是小編幫大家整理的《月亮與六便士》讀後感,歡迎閱讀,希望大家能夠喜歡。《月亮與六便士》讀後感1毛姆在中國的 -
PHP用Redis替代文件存儲Session的方法
介紹了PHP使用Redis替代文件存儲Session的方法,結合實例形式較爲詳細的分析了Session的基本操作方法及使用Redis存儲session的相關技巧,需要的朋友可以參考下.本文實例講述了PHP使用Redis替代文件存儲Session的`方法 -
Session在PHP中的使用
很簡單!主要材料:看圖所需工具:看圖製作步驟:第1步:第2步:第3步:第4步:第5步:第6步:第7步:第8步: -
php中Session存儲到Redis的方法
php Session可以保存到文本或者內存、還有數據庫,今天講的.是存到Redis的方法。就讓小編來告訴大家吧! 修改的設置複製代碼 代碼如下:_handler = redis_path = tcp://″修改後重啓php-fpm或nginx,phpinfo()sessi -
php中session的基礎知識大綱
PHP是一種通用開源腳本語言。下面是小編整理的php中session的基礎知識,希望對大家有幫助! session 的生命週期是多長1 瀏覽器結束時其生命週期也同時結束,但是檔案仍然存在於 /tmp/(sess_???)2 下次重新開瀏覽器時會重 -
如何使用php中session
學會php session可以在很多地方使用,比如做一個後臺登錄的功能,要讓程序記住用戶的session,其實很簡單,看了下面的文章你就明白了。P session用法其實很簡單它可以把用戶提交的數據以全局變量形式保存在一個session中並且 -
php語言中session用法
PHP之所以能過成爲熱門語言,必定有很多值得學習的地方。以下是本站小編精心爲大家整理的 PHP語言中 Session 的使用方法,希望對大家學習有所幫助!更多內容請關注應屆畢業生網!PHP有很多值得學習的地方,這裏我們主要介紹P