摘要:的存儲方式在文件中,進行配置。一文件存儲注釋表示多級目錄,值為數字。表示創建的文件權限。例如,設定為將使創建的會話文件和路徑類似于。通過修改可選參數來改變這種默認行為,其中是的八進制表示。設置不影響進程的掩碼。多機房的存儲怎么弄同步唄
Session 的存儲方式
在 php.ini 文件中,進行配置。
涉及配置參數:
- session.save_handler - session.save_path
注意:這兩個參數可以在 PHP 中通過 ini_set 來設置,不用直接覆蓋原 php.ini 中的值。
一、文件存儲
session.save_handler = files session.save_path = "N;MODE;/path"
注釋:N 表示多級目錄,值為數字。MODE 表示創建的 Session 文件權限。/path 表示 Session 存儲路徑。
這里我設置
session.save_path = "2;600;/tmp/"
重啟PHP-FPM,然后寫個測試腳本 test.php,代碼里運行 session_start();
結果報錯
PHP Warning: session_start(): open(/tmp/h/p/sess_hpbfs95c9omtfn30h5lt43i597, O_RDWR) failed: No such file or directory
為什么呢?
我們來看下PHP官網怎么說的吧
此指令還有一個可選的 N 參數來決定會話文件分布的目錄深度。例如,設定為 "5;/tmp" 將使創建的會話文件和路徑類似于 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If。 要使用 N 參數,必須在使用前先創建好這些目錄。 在 ext/session 目錄下有個小的 shell 腳本名叫 mod_files.sh,windows 版本是 mod_files.bat 可以用來做這件事。 此外注意如果使用了 N 參數并且大于 0,那么將不會執行自動垃圾回收,更多信息見 php.ini。 另外如果用了 N 參數,要確保將 session.save_path 的值用雙引號 "quotes" 括起來,因為分隔符分號( ;)在 php.ini 中也是注釋符號。 文件儲存模塊默認使用 mode 600 創建文件。通過 修改可選參數 MODE 來改變這種默認行為: N;MODE;/path ,其中 MODE 是 mode 的八進制表示。 MODE 設置不影響進程的掩碼(umask)。 Caution:使用以上描述的可選目錄層級參數 N 時請注意,對于絕大多數站點,大于1或者2的值會不太合適——因為這需要創建大量的目錄:例如,值設置為 3 需要在文件系統上創建 64^3 個目錄,將浪費很多空間和 inode。僅僅在絕對肯定站點足夠大時,才可以設置 N 大于2。
了解這些,我們就開始處理 Session 存儲目錄的創建了,注意子目錄的權限問題。
bash /path/to/mod_files.sh
使用多級目錄的后果就是,你必須手動清理這些 Session。
二、Redis
首先你得安裝了 Redis 擴展
session.save_handler = redis //多節點 session.save_path = "tcp://ip:port?auth=secret?weight=1&timeout=2.5,tcp://ip2:port2?weight=2" //單個節點 session.save_path = "tcp://ip:port?auth=secret?weight=1&timeout=2.5" //socket 方式 session.save_path = "unix:///var/run/redis/redis.sock?persistent=1&weight=1&database=0
解釋一下,涉及參數的含義:
ip: Redis 節點的 IP。 port: Redis 節點的端口。 auth: 與 Redis 節點進行權限驗證。 weight: 權重,上面的例子表示session數量,ip2節點 是 ip1節點的兩倍。 timeout: Redis 連接超時時間。單位:秒。連接失敗時,Session不可用(風險!) persistent: 持久連接。 prefix: 前綴,默認是 "PHPREDIS_SESSION:"。 database: 選擇哪個 Redis 數據庫。取值:int。參見 Redis 配置 databases 16。
重啟PHP-FPM,然后寫個測試腳本 test.php,代碼里運行 session_start();
我們看看效果
redis-cli 127.0.0.1:6379> KEYS * 1) "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2" 127.0.0.1:6379> TYPE "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2" string 127.0.0.1:6379> get "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2" "admin_user|a:3:{s:8:"username";s:4:"test";s:4:"name";s:4:"test";s:5:"email";s:12:"test@test.cn";}" 127.0.0.1:6379> ttl "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2" (integer) 292
可以看到 Session 存入了 Redis 中,數據結構用的是 String。
Session 的過期時間
使用 php.ini 中的 session.gc_maxlifetime 可以通過 ini_set 在 php 中自定義。
多機房的 Redis 存儲怎么弄?
同步唄!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30256.html
世界上任何一個擁有用戶數據的 web 應用都必須處理 sessions。作為一名開發者,我們必須要知道它們是什么以及如何處理它們。在這篇文章中,我想要分享的是: session 是什么? session 如何存儲數據? 你如何決定存放 session 數據的位置? 在 sessions 工作時,你必須意識到的安全性上的影響有哪些?在一些示例代碼中,我將會運用?session npm modul...
摘要:所謂的無連接就是服務器收到了客戶端的請求之后,響應完成并收到客戶端的應答之后,即斷開連接。從而節省傳輸時間。協議對事務的處理沒有記憶能力。這種方式某種方面上講解放了服務器,但是卻不利于客戶端與服務器的連接。 session與cookie是什么? session與cookie屬于一種會話控制技術.常用在身份識別,登錄驗證,數據傳輸等.舉個例子,就像我們去超市買東西結賬的時候,我們要拿出我...
摘要:初步的猜想是第一次和第二次請求間隔太短,數據還沒有存進,到時讀取失敗,帶著這樣的疑問,閱讀了的源碼。源碼非常簡單,沒有復雜的數據結構和算法,讀起來沒費什么勁。當過期后,用戶獲取的就為空,就會為用戶重新初始化生成。 歡迎大家訪問我的博客,查看更多內容。 背景 最近在做djnago開發時,遇到一個session問題,過程如下,第一個POST請求時,把數據存放在session,在第二次POS...
摘要:保持狀態保存在瀏覽器端,保存在服務器端存儲的大小單個保存的數據不能超過大小沒有限制。的目的是克服由所帶來的一些限制,當數據需要被嚴格控制在客戶端時,不需要持續的將數據發回服務器。的生命周期是僅在當前會話下有效。 寫在前面 既然是淺談,就不會詳細從底層原理解釋這幾個的區別,就簡單地聊一下,這幾個的區別,優缺點,應用場景 cookie和session 瀏覽器的緩存機制提供了可以將用戶數據存...
摘要:會話管理一直是企業級應用的重要部分。傳統會話管理技術的問題的目的是解決傳統的會話管理技術的各種問題。對如和之類的閉源產品,找到適合它們的會話管理技術的替代實現則通常是不可能的。典型的應用會將當前用戶的身份及其安全級別或角色存儲在會話里面。 歡迎大家前往騰訊云+社區,獲取更多騰訊海量技術實踐干貨哦~ 本文來自云+社區翻譯社,由Tnecesoc編譯。 會話管理一直是 Java 企業級應用的...
閱讀 1599·2021-11-02 14:48
閱讀 3651·2019-08-30 15:56
閱讀 2767·2019-08-30 15:53
閱讀 3208·2019-08-30 14:09
閱讀 3094·2019-08-30 12:59
閱讀 2853·2019-08-29 18:38
閱讀 2693·2019-08-26 11:41
閱讀 2209·2019-08-23 16:45