php的session機制
A. php(或其他語言) 的Session 運行機制是
session實現與工作原理
瀏覽器和伺服器採用http無狀態的通訊,為了保持客戶端的狀態,使用session來達到這個目的。然而服務端是怎麼樣標示不同的客戶端或用戶呢?
假如你參加一個晚會,認識了很多人,你會採取什麼方式來區分不同的人呢!你可能根據臉型,也有可能根據用戶的名字,或者人的身份證,即採用一個獨一無二的標示。在session機制中,也採用了這樣的一個唯一的session_id來標示不同的用戶,不同的是:瀏覽器每次請求都會帶上由伺服器為它生成的session_id.
簡單介紹一下流程:當客戶端訪問伺服器時,伺服器根據需求設置session,將會話信息保存在伺服器上,同時將標示session的session_id傳遞給客戶端瀏覽器,
瀏覽器將這個session_id保存在內存中(還有其他的存儲方式,例如寫在url中),我們稱之為無過期時間的cookie。瀏覽器關閉後,這個cookie就清掉了,它不會存在用戶的cookie臨時文件。
以後瀏覽器每次請求都會額外加上這個參數值,再伺服器根據這個session_id,就能取得客戶端的數據狀態。
如果客戶端瀏覽器意外關閉,伺服器保存的session數據不是立即釋放,此時數據還會存在,只要我們知道那個session_id,就可以繼續通過請求獲得此session的信息;但是這個時候後台的session還存在,但是session的保存有一個過期
時間,一旦超過規定時間沒有客戶端請求時,他就會清除這個session。
下面介紹一下session的存儲機制,默認的session是保存在files中,即以文件的方式保存session數據。在php中主要根據php.ini的配置session.save_handler來選擇保存session的方式。如果要做伺服器的lvs,即多台server的話,我們一般使用memcached的方式session,否則會導致一些請求找不到session。
一個簡單的memcache配置:
session.save_handler = memcache
session.save_path = "tcp://12.8.1.8:1000"
當然如果一定要使用files文件緩存,我們可以將文件作nfs,將所有的保存session文件定位到一個地方。返回給用戶的session-id最終保存在內存中,這里我們也可以設置參數將其保存在用戶的url中。
B. 請描述 php session 的運行機制,大型網站中session方面應注意什麼
運行機制:客戶端將session id傳遞到伺服器,伺服器根據session id找到對應的文件,讀取的時候對文件內容進行反序列化就得到session的值,保存的時候先序列化再寫入
注意:1,session在大訪問量網站上確實影響系統性能,影響性能的原因之一由文件系統設計造成,在同一個目錄下超過10000個文件時,文件的定位將非常耗時,可以通過修改php.ini中session.save_path設置兩級子目錄 ,session將存儲在兩級子目錄中,每個目錄有16個子目錄[0~f],不過好像PHP session不支持創建目錄,你需要事先把那麼些目錄創建好 。
C. Session機制的PHP Session 變數
PHP session 變數用於存儲關於用戶會話(session)的信息,或者更改用戶會話(session)的設置。Session 變數存儲單一用戶的信息,並且對於應用程序中的所有頁面都是可用的。
您在計算機上操作某個應用程序時,您打開它,做些更改,然後關閉它。這很像一次對話(Session)。計算機知道您是誰。它清楚您在何時打開和關閉應用程序。然而,在網際網路上問題出現了:由於 HTTP 地址無法保持狀態,Web 伺服器並不知道您是誰以及您做了什麼。
PHP session 解決了這個問題,它通過在伺服器上存儲用戶信息以便隨後使用(比如用戶名稱、購買商品等)。然而,會話信息是臨時的,在用戶離開網站後將被刪除。如果您需要永久存儲信息,可以把數據存儲在資料庫中。
Session 的工作機制是:為每個訪客創建一個唯一的 id (UID),並基於這個 UID 來存儲變數。UID 存儲在 cookie 中,或者通過 URL 進行傳導。
D. PHP中cookie和session的區別實例分析
Session是由應用伺服器維持的一個伺服器端的存儲空間,用戶在連接伺服器時,會由伺服器生成一個唯一的SessionID,用該SessionID
為標識符來存取伺服器端的Session存儲空間。而SessionID這一數據則是保存到客戶端,用Cookie保存的,用戶提交頁面時,會將這一
SessionID提交到伺服器端,來存取Session數據。這一過程,是不用開發人員干預的。所以一旦客戶端禁用Cookie,那麼Session也會失效。
伺服器也可以通過URL重寫的方式來傳遞SessionID的值,因此不是完全依賴Cookie。如果客戶端Cookie禁用,則伺服器可以自動通過重寫URL的方式來保存Session的值,並且這個過程對程序員透明。
可以試一下,即使不寫Cookie,在使用request.getCookies();取出的Cookie數組的長度也是1,而這個Cookie的名字就是JSESSIONID,還有一個很長的二進制的字元串,是SessionID的值。
大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都打開新的會話,而且伺服器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現
網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變數的值保存在伺服器端,通過SessionID來區分不同
的客戶,session是以cookie或URL重寫為基礎的,默認使用cookie來實現,系統會創造一個名為JSESSIONID的輸出
cookie,我們叫做session
cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session
cookie是存儲於瀏覽器內存中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但
是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在地址欄看到
sessionid=KWJHUG6JJM65HS2K6之類的字元串。
明白了原理,我們就可以很容易的分辨出persistent cookies和session
cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,session
cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent
cookie只是存在於客戶端硬碟上的一段文本(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站腳本攻擊,自然不如session
cookie安全了。
通常session
cookie是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了,此時我們可以先把sessionid保存在persistent
cookie中,然後在新窗口中讀出來,就可以得到上一個窗口SessionID了,這樣通過session
cookie和persistent cookie的結合我們就實現了跨窗口的session tracking(會話跟蹤)。
在一些web開發的書中,往往只是簡單的把Session和cookie作為兩種並列的http傳送信息的方式,session
cookies位於伺服器端,persistent
cookie位於客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯系和區別,我們就不難選擇合適的技術來開發web
service了。
實例附上出處鏈接:http://www.jb51.net/article/54436.htm
E. php中$_session[]是什麼意思
用戶會話保存變數
1.php文件
<?php
session_start();
$_SESSION["str"]="我是中國人!!!";
?>
2.php文件
<?php
session_start();
echo $_SESSION["str"];
?>
先執行1.php,,再執行2.php,,會看到在1.php裡面設置的變數被輸出了,,就這作用,,用來保存跨域的變數
樓上說的不對,,session雖說是保存在伺服器端,,但對客戶端仍有數據發送,並且是以cookie的方式,,如果客戶端禁用了cookie,,session也是用不了的.....還有,,session也是可以造假的...並不一定百分之一百安全
F. 關於PHP里SESSION的問題
session是在用戶登錄伺服器後,伺服器給每個用戶一個sessionID,這個是唯一的,通常我寫程序會在session裡面記錄一下登錄用戶的信息,你在A機器上面訪問那個給session賦值的頁面,這個時候那個賦值已經這個A機器的sessionID對應的session了,而跑到B機器上面的話,你只訪問那個輸出的頁面,因為沒有賦值,肯定不會顯示,就是先訪問了賦值的頁面,輸出來了,也和A機器的是不一樣的sessionID
G. php如何存儲session,刷新頁面以後session 還存在嗎
刷新還在
有用到SESSION的頁面需要在有頁面輸出前執行此語句:
session_start();
然後SESSION賦值:$_SESSION['val'] = 『test』;
輸出:echo $_SESSION['val'];
如上面所說,SESSION關閉瀏覽器後就失效了
H. php session回收機制 為什麼會是幾率回收
session.gcprobability = 1
session.gcdivisor = 100
session.gc_maxlifetime = 1440
這三個配置組合構建服務端session的垃圾回收機制
session.gc_probability與session.gc_divisor構成執行session清理的概率,理論上的解釋為服務端定期有一定的概率調用gc函數來對session進行清理,清理的概率為: gc_probability/gc_divisor 比如:1/100 表示每一個新會話初始化時,有1%的概率會啟動垃圾回收程序,清理的標准為session.gc_maxlifetime定義的時間
摘自:segmentfault社區