session是什麼,剛開始我也不明白,非專業詞典翻譯為會議,會議期。作個不太恰當的比喻吧
(雖然不恰當,但意義卻是一樣的),session是你和網站之間的感情。session在WEB技術中占有非常重要的份量。由於網頁是一種無狀態的連接程序,因此你無法得知用戶的浏覽狀態。因此我們必須
通過session記錄用戶的有關信息,以供用戶再次以此身份對web服務器提供要求時作確認,例
如,我們在某些網站中常常要求用戶登錄,但我們怎麼知道用戶已經登錄了呢,如果沒有session的話,登錄信息是無法保留的,那豈不要讓用戶在每一頁網頁中都要提供用戶名和密碼。
當然,session不光用於用戶身份認證功能,還可能用於其它方面,以後我們會提到的。session用中文來解釋就是會話期。一個會話期開始於用戶輸入一個站點的網址時,結束於他離開這個站點時。session最早出現在動態腳本語言ActiveServerPages中,它的功能之強大,是一句話無法說清楚的。
當php還在3.0版本時,session是它永遠的痛。雖然php具有執行速度快,使用靈活,功能強大等優點,但因為session的問題,使很多站點的開發放棄了php,至少我的老板是這樣認為的。當時有很多php免費函數庫提供在php3上實現session的方案,但都讓人感覺不正宗。就好象你花好幾千大洋買的手機卻配置一個很粗糙的草作的袋子一樣,雖然功能是一樣的,但總讓人覺得別扭。php4的出現讓PHP在session問題上有了翻身的機會。雖然它的session實現還不是很理想(主要是效率問題),但畢竟是它自己實現的,而且可以實際使用了。那我們用session干什麼呢,你說了半天,我用不上的話,你豈不有賣紙張之嫌。OK,我們來看看session有什麼用:作過網站的人都有這樣的體會,在一頁頁面中的變量(在本章都指服務器端變量,下同)是不能在下一頁中用的,雖然有一些辦法可以實現,比如用form,urlstring等等,但有些對於用戶來說是不方便的,即使讓form自動提交,但其中的延時在現今的網絡狀況下足以讓人窒息,而這兩種方法都明顯加大程序員的負擔。如果你正在開發一個大型項目,那這些額外的負擔是不能忽略的。而有了session就好辦了,session中注冊的變量可以作為全局變量使用。什麼,全局變量?好極了。這樣一來,你知道有什麼用了吧:最主要的用於用戶身份認證,程序狀態記錄,頁面之間參數傳遞。
說了它這麼半天的好處,你已經動心了吧,先別高興,它還有缺點呢:它是用文件保存的變量(當然效率不高了,雖然可以用別的方式,但很麻煩的),不能保存對象。與之相對的是,asp中的session可以保存對象變量,用內存變量來保存session變量。但為什麼我們還選用php呢,呵呵,為什麼,你能從本書的開始看到這章,想必你也應該明白了吧,你還不明白,Faint,你再從頭看起吧,我保證你成為PHP專家^_^。
session是怎樣實現的呢?呵呵,你一定以為很高深吧,我來告訴你它的秘密。如果說只保存變量的話,很多讀者都明白,這是很簡單的,但前面我們說過,http協議是一種無狀態的連接,你怎麼知道那個變量是誰的,這個變量又是誰的呢?在session實現中用cookie實現的。cookie存在於客戶端,也就是用戶的機器中,裡面保存著用戶的sessionID,也就是session號碼,當用戶的浏覽器請求服務器時把sessionID也一起送到服務器,這樣服務器就可以識別你是誰,也就可以把變量識別開了。這樣我們就不難理解了,為什麼有時session會失效了。不信的話,你可以試試:在IE的"工具"菜單上有"Internet選項"菜單,打開後再選"安全"->"自定義級別",將安全設置中的"允許使用每個對話cookies"設為禁用,再看看session能不能用。這下明白了吧!不過PHP4在linux/unix平台上可以自動檢查cookies狀態,當cookies不可用時,自動會把sessionID附帶在url上進行傳遞。這是它在session方面比asp多的唯一的優點了。