session 存儲方式


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 存儲怎么弄?

同步唄!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM