99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Php學(xué)習(xí)之session機制詳解

發(fā)布時間:2017-06-03 22:49  回復(fù):0  查看:2328   最后回復(fù):2017-06-03 22:49  

本文和大家分享的主要是php中session機制相關(guān)內(nèi)容,一起來看看吧,希望對大家學(xué)習(xí)php有所幫助。

  默認情況下,我們是直接使用SESSION來操作會話,并且以文件的形式保存,一個會話對應(yīng)一個文件。如果單個目錄下存儲太多會話文件影響讀取效率,可以通過配置多級目錄存儲。默認使用文件保存會話,存在單機情況,不能部署應(yīng)用群集的方式來擴展PHP應(yīng)用。但是使用memcacheredis等擴展,通過配置可以直接把會話保存到memcacheredis中,并且不需要改變之前的使用方式,直接使用SESSION來操作會話,并且以文件的形式保存,一個會話對應(yīng)一個文件。如果單個目錄下存儲太多會話文件影響讀取效率,可以通過配置多級目錄存儲。默認使用文件保存會話,存在單機情況,不能部署應(yīng)用群集的方式來擴展PHP應(yīng)用。但是使用memcacheredis等擴展,通過配置可以直接把會話保存到memcacheredis中,并且不需要改變之前的使用方式,直接使用_SESSION,這樣能方便地擴展集群,并且簡單高效。

  PHP Session的啟動,可以配置為是否自動啟動,是的話,每個請求一開始,就可以直接使用SESSION了,SESSION了,_SESSION里的內(nèi)容已經(jīng)(從文件 、memcache、redis中)取出來了;如果否,程序中則要調(diào)用session_start來啟動。想要更多的控制權(quán),就不要自動啟動,比如一些頁面不需要會話的,就不應(yīng)啟動會話(因為啟動了又不用,還要浪費會話讀取的功夫)。

  進一步探究,PHP提供了一套機制:session_set_save_handler注冊回調(diào)方法和實現(xiàn)SessionHandlerInterface接口(5.4版本后支持),這兩者使用差別不是很多,隨意選擇,都要實現(xiàn)open, read, close,write,gc,destroy這幾個方法。當session_start()時,調(diào)用openread方法,把會話讀取到SESSION變量中,用戶就可以在當前請求中,存取SESSION變量中,用戶就可以在當前請求中,存取_SESSION變量。在程序執(zhí)行完后,在輸出流結(jié)束以后,在有 register_shutdown_function() 方法執(zhí)行以后,執(zhí)行writeclose方法,將會話內(nèi)容寫回到存儲系統(tǒng)。這樣我們就可以自定義把會話保存到數(shù)據(jù)庫中,或者保存到memcache/redis等緩存系統(tǒng)中。

  根據(jù)上面PHP會話機制的了解,有如下主要實踐,也是優(yōu)化方案:

  1. 把會放的啟動控制放到控制器(基類控制器、子類控制器、甚至控制器中的方法),讓控制器決定是否使用會話。

  2. 不要直接使用SESSION變量,而是封成方法,比如sget/sset/sdel來獲取/保存/刪除會話內(nèi)容,因為直接使用SESSION變量,而是封成方法,比如sget/sset/sdel來獲取/保存/刪除會話內(nèi)容,因為直接使用_SESSION無法進一步控制或優(yōu)化。

  3. 實際上網(wǎng)站在使用會話時,大部分都是讀取操作,而不會修改會話內(nèi)容,因此可采取只讀而不回寫策略,能減少一次網(wǎng)絡(luò)操作。需要結(jié)合第2點,當會話操作時,維護一個變量isChange,讀會話時不需要設(shè)置isChange,讀會話時不需要設(shè)置isChange,設(shè)置或刪除會話時isChange=true;當PHP執(zhí)行session方法write時,對isChange=true;當PHP執(zhí)行session方法write時,對isChange進行判斷,有變更時進行寫回,沒有變更時,直接返回。

  進一步的考慮是,把session的內(nèi)容保存到cookie中,并進行加密。這樣的好處是,不需要為session消耗太多服務(wù)器資源,壞處是,增加稍許的網(wǎng)絡(luò)流量,總得來說值得使用。cookie盡量不要保存太多數(shù)據(jù),可結(jié)合數(shù)據(jù)庫或緩存系統(tǒng),比如只把登錄所需要的用戶角色權(quán)限相關(guān)數(shù)據(jù)作為會話保存到cookie中,而與購物車,其它臨時數(shù)據(jù)等存到緩存。

  session數(shù)據(jù)的編碼解碼,簡單地可使用serialize/unserialize/json_encode/json_decode進行編碼解碼。而加解密按需選取一個加密算法即可。

  使用cookie會話一般都要 ob_start()開始輸出緩沖區(qū), 注意不要在在關(guān)閉緩沖區(qū)或輸出流關(guān)閉后再設(shè)置cookie,或者輸出內(nèi)容后再設(shè)置 cookie, 否則會報: Cannot modify header information - headers already sent 。如果是在程序結(jié)束后,再調(diào)用sessionwrite方法設(shè)置cookie,在遇到輸出圖形校驗碼或比較大的文件內(nèi)容等情況會出錯。一種解決方法在設(shè)置會話時立即輸出header,然后再輸出其它內(nèi)容,而不是等到執(zhí)行會話的write方法時再輸出cookieheader信息。

  如果把session放到cookie中,會增大header頭部數(shù)據(jù)量,通過nginx等反向代理轉(zhuǎn)發(fā)時,可能需要調(diào)整轉(zhuǎn)發(fā)的buffer.

 

來源:CSDN

您還未登錄,請先登錄

熱門帖子

最新帖子

?