當前位置:
首頁 > 知識 > PHP之session機制和優化

PHP之session機制和優化

本文說一說PHP中的Session機制和優化的話題。

默認情況下,我們是直接使用

S

ESSION

使

PHP

使

memcache

redis

memcache

redis

使

使

SESSION來操作會話,並且以文件的形式保存,一個會話對應一個文件。如果單個目錄下存儲太多會話文件影響讀取效率,可以通過配置多級目錄存儲。默認使用文件保存會話,存在單機情況,不能部署應用群集的方式來擴展PHP應用。但是使用memcache和redis等擴展,通過配置可以直接把會話保存到memcache和redis中,並且不需要改變之前的使用方式,直接使用

_SESSION,這樣能方便地擴展集群,並且簡單高效。

PHP Session的啟動,可以配置為是否自動啟動,是的話,每個請求一開始,就可以直接使用

S

ESSION

SESSION了,

_SESSION里的內容已經(從文件 、memcache、redis中)取出來了;如果否,程序中則要調用session_start來啟動。想要更多的控制權,就不要自動啟動,比如一些頁面不需要會話的,就不應啟動會話(因為啟動了又不用,還要浪費會話讀取的功夫)。

進一步探究,PHP提供了一套機制:session_set_save_handler註冊回調方法和實現SessionHandlerInterface介面(5.4版本後支持),這兩者使用差別不是很多,隨意選擇,都要實現open, read, close,write,gc,destroy這幾個方法。當session_start()時,調用open和read方法,把會話讀取到

S

ESSION

SESSION變數中,用戶就可以在當前請求中,存取

_SESSION變數。在程序執行完後,在輸出流結束以後,在有 register_shutdown_function() 方法執行以後,執行write和close方法,將會話內容寫回到存儲系統。這樣我們就可以自定義把會話保存到資料庫中,或者保存到memcache/redis等緩存系統中。

根據上面PHP會話機制的了解,有如下主要實踐,也是優化方案:

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

2. 不要直接使用

S

ESSION

sget

/

sset

/

sdel

/

/

使

SESSION變數,而是封成方法,比如sget/sset/sdel來獲取/保存/刪除會話內容,因為直接使用

_SESSION無法進一步控制或優化。

3. 實際上網站在使用會話時,大部分都是讀取操作,而不會修改會話內容,因此可採取只讀而不回寫策略,能減少一次網路操作。需要結合第2點,當會話操作時,維護一個變數

isChange

isChange,讀會話時不需要設置

isChange,設置或刪除會話時

isChange=true

PHP

session

write

isChange=true;當PHP執行session方法write時,對

isChange進行判斷,有變更時進行寫回,沒有變更時,直接返回。

進一步的考慮是,把session的內容保存到cookie中,並進行加密。這樣的好處是,不需要為session消耗太多伺服器資源,壞處是,增加稍許的網路流量,總得來說值得使用。cookie盡量不要保存太多數據,可結合資料庫或緩存系統,比如只把登錄所需要的用戶角色許可權相關數據作為會話保存到cookie中,而與購物車,其它臨時數據等存到緩存。

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

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

如果把session放到cookie中,會增大header頭部數據量,通過nginx等反向代理轉發時,可能需要調整轉發的buffer.

根據以上的機制和思路,簡單實現了關於會話的封裝,可參考github中的session目錄:https://github.com/frogluo/php/

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

否則很難通過。

(以上系廣告合作內容,請同學們注意甄別內容真偽!)

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 PHP技術大全 的精彩文章:

PHP的分布式跟蹤的一些心得
有贊的zan framework安裝與使用2
PHP實現文本快速查找-二分查找法
swoole2-mysqlpool:基於 Swoole 2 協程特性實現的 MySQL 連接池
Deployer 5.0.0 發布,PHP 編寫應用部署工具

TAG:PHP技術大全 |

您可能感興趣

PHP的session的實現機制
《Science Advances》Highlights重磅!應用賽特SE-iFISH揭秘乳腺癌轉移機制
Spring AOP 的實現機制
OpenStack-Neutron的資源隔離機制
SpringCloud如何實現Eureka集群、HA機制?
為什麼 Android 要採用 Binder 作為 IPC 機制?
HDFS BlockToken機制解析
Android 消息機制—ThreadLocal
石磊教授課題組Nature Communications揭示蛋白質去泛素化酶USP52在乳腺癌發生髮展中的作用和相關機制
在TensorFlow+Keras環境下使用RoI池化一步步實現注意力機制
android 結合源碼深入剖析AsyncTask機制原理
VR遊戲《Apex Construct》更新帶來競爭機制
阿里開源富容器引擎 PouchContainer的network 連接機制
Nature Communications 最新研究揭示調控種子休眠和萌發的新機制
Nature Neuroscience:「壓力傳播」的神經機制
P2SP+Token機制,Spacebook 做好區塊鏈基礎設施的兩把利器
Sci Immunol:揭示HIV入侵新機制
Cellular Microbiology:流感病毒調控宿主細胞周期的新機制
Yorda與Elika:從 AI 互動機制談共情體驗
乾貨 | NLP中的self-attention【自-注意力】機制