ThinkPHP的Session操作
[ 概述 ]
ThinkPHP對Session操作進行了封裝,並且無需引入就可以使用,Session的啟動會在應用初始化的時候自動執行,所以無需手動使用Session::start()
來啟動Session。
使用Session類操作和普通方式呼叫$_SESSION來操作並沒有本質不同,只是Session類很多引數可以根據專案配置來靈活設定。
[ 方法 ]
Session類封裝了很多的靜態操作方法,常用方法包括包括:
start 啟動session
pause 暫停session
clear 清除session
destroy 銷燬session
get 獲取session值
getLocal 獲取私有session值
set 設定session值
setLocal 設定私有session值
name 獲取或者設定session_name
is_set 是否設定session值
is_setLocal 是否設定私有session值
id 獲取或者設定session_id
path 獲取或者設定session_save_path
setExpire 設定session過期時間
setCookieDomain 設定有效域名
setCallback 設定Session 物件反序列化時候的回撥函式
[ 示例 ]
最常用的操作方法示例:
- // 檢測Session變數是否存在
- Session::is_set('name');
- // 給Session變數賦值
- Session::set('name','value');
- // 獲取Session變數
- Session::get('name');
[ 配置 ]
和Session相關的配置引數:
- 'SESSION_NAME'=>'ThinkID', // 預設Session_name
- 'SESSION_PATH'=>'', // 採用預設的Session save path
- 'SESSION_TYPE'=>'File', // 預設Session型別 支援 DB 和 File
- 'SESSION_EXPIRE'=>'300000', // 預設Session有效期
- 'SESSION_TABLE'=>'think_session', // 資料庫Session方式表名
- 'SESSION_CALLBACK'=>'', // 反序列化物件的回撥方法其中
SESSION_NAME
引數需要注意,如果需要在不同的專案之間不共享傳遞Session的值,請設定不同的值,否則請保留相同的預設值。
如果設定了相同的SESSION_NAME的值,但是又希望建立基於專案的私有Session空間,應該怎麼處理呢?ThinkPHP還支援以專案為Session空間的私有Session操作,以之前的常用操作為例,我們更改如下:
- // 檢測Session變數是否存在(當前專案有效)
- Session::is_setLocal('name');
- // 給Session變數賦值(當前專案有效)
- Session::setLocal('name','value');
- // 獲取Session變數(當前專案有效)
- Session::getLocal('name');
這樣,和全域性的Session操作就不會衝突,可以用於一些特殊情況的需要。
ThinkPHP支援資料庫方式的Session操作,設定SESSION_TYPE的值為DB就可以了,如果使用資料庫方式,還要確保設定好SESSION_TABLE的值,並且匯入下面的DDL到你的資料庫(以MySQL為例子):
程式碼: 複製內容到剪貼簿
- CREATE TABLE `think_session` (
- `id` int(11) unsigned NOT NULL auto_increment,
- `session_id` varchar(255) NOT NULL,
- `session_expires` int(11) NOT NULL,
- `session_data` blob,
- PRIMARY KEY (`id`)
- )
注意,Db Session方式的資料庫連線會採用專案的資料庫配置資訊進行連線。除了資料庫方式外,還可以增加其它方式的Session儲存機制,例如記憶體方式、 Memcache方式等,我們只要增加相應的過濾器就行了,使用session_set_save_handler方法,具體的方法定義參考 Think.Util.Filter下面的FilterSessionDb.class.php 檔案的實現。