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的分布式跟蹤的一些心得
※有贊的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【自-注意力】機制