對於session的瞭解,以前一直沒有仔細研究過,最近遇到了一些問題,須要解決session配置問題,就順便查看了些資料。一下大可能是網上的資料,本身只是整理了下,若是有錯誤但願能指出,感謝!php
先看下php.ini中session的相關配置的解釋。使用 php -i|grep 'php.ini' 找到php.ini的文件目錄位置,下面是php.ini配置內容。參考官網:SESSION配置html
[Session] ; 定義了來存儲和獲取與會話關聯的數據的處理器的名字。默認爲 files ; Handler used to store/retrieve data. ; http://php.net/session.save-handler ; 也能夠將session存入到redis,對應的key:PHPREDIS_SESSION:d7sq31qsvtcpsl6khacn068dg3 ; session.save_handler = redis session.save_handler = files ; session.save_path 定義了傳遞給存儲處理器的參數。若是選擇了默認的 files 文件處理器,則此值是建立文件的路徑。默認爲 /tmp ; redis對應的設置 ; session.save_path = "tcp://127.0.0.1:6379?auth=123456" session.save_path = "/tmp" ; session.use_cookies 指定是否在客戶端用 cookie 來存放會話 ID。默認爲 1(啓用)。 ; 若是爲1的話,就能夠在瀏覽器的Cookies中看到本次會話的sessionid session.use_cookies = 1
能夠以chrome爲例:redis
;指定是否在客戶端僅僅使用 cookie 來存放會話 ID。。啓用此設定能夠防止有關經過 URL 傳遞會話 ID 的攻擊。此設定是 PHP 4.3.0 添加的。自PHP 5.3.0開始,默認值改成1(啓用) session.use_only_cookies = 1 ; Name of the session (used as cookie name). ; session.name 指定會話名以用作 cookie 的名字。只能由字母數字組成,默認爲 PHPSESSID,對應session_name() session.name = PHPSESSID ; Initialize session on request startup. ; session.auto_start 指定會話模塊是否在請求開始時自動啓動一個會話。默認爲 0(不啓動) session.auto_start = 0 ; session.cookie_lifetime 以秒數指定了發送到瀏覽器的 cookie 的生命週期。值爲 0 表示「直到關閉瀏覽器」。默認爲 0 ; Lifetime in seconds of cookie or, if 0, until browser is restarted. session.cookie_lifetime = 0 ; session.gc_probability 與 session.gc_divisor 合起來用來管理 gc(garbage collection 垃圾回收)進程啓動的機率。默認爲 1 session.gc_probability = 1 ; session.gc_divisor 與 session.gc_probability 合起來定義了在每一個會話初始化時啓動 gc(garbage collection 垃圾回收)進程的機率。此機率用 gc_probability/gc_divisor 計算得來。例如 1/100 意味着在每一個請求中有 1% 的機率啓動 gc 進程。session.gc_divisor 默認爲 100。 session.gc_divisor = 1000 ; session.gc_maxlifetime 指定過了多少秒以後數據就會被視爲「垃圾」並被清除。 垃圾蒐集可能會在 session 啓動的時候開始( 取決於session.gc_probability 和 session.gc_divisor) ; After this number of seconds, stored data will be seen as 'garbage' and ; cleaned up by the garbage collection process. session.gc_maxlifetime = 3600
; 指定是否啓用透明 SID 支持。默認爲 0(禁用),好比可使用url傳遞若是設置爲1 session.use_trans_sid = 0
參考這兩篇文章:
如何設置一個嚴格30分鐘過時的Session
php會話(session)生命週期概念介紹及設置更改和回收
session是由服務端建立的,php程序中若是php.ini中沒有配置session.auto_start = 1的話,那麼只有使用了session_start纔會建立。
session_start() 會建立新會話或者重用現有會話。 若是經過 GET 或者 POST 方式,或者使用 cookie 提交了會話 ID, 則會重用現有會話。當會話自動開始或者經過 session_start() 手動開始的時候, PHP 內部會調用會話管理器的 open 和 read 回調函數。 會話管理器多是 PHP 默認的, 也多是擴展提供的(SQLite 或者 Memcached 擴展), 也多是經過 session_set_save_handler() 設定的用戶自定義會話管理器。 經過 read 回調函數返回的現有會話數據(使用特殊的序列化格式存儲), PHP 會自動反序列化數據而且填充 $_SESSION 超級全局變量chrome
嚴格控制30分鐘過時的Sessionapi
class Session{ /** * 設置session * @param [type] $name [description] * @param [type] $data [description] * @param integer $expire [description] */ public function set($name,$data,$expire = 300){ $sessionData = []; $sessionData['data'] = $data; $sessionData['expire'] = time() + $expire; $_SESSION[$name] = $sessionData; } /** * 獲取session * @param [type] $name [description] * @return [type] [description] */ public function get($name){ if(!isset($_SESSION[$name])){ return false; } if($_SESSION[$name]['expire']>time()){ return $_SESSION[$name]['data']; }else{ self::clear($name); } return false; } /** * 清除session * @param [type] $name [description] * @return [type] [description] */ private static function clear($name){ if(isset($_SESSION[$name])){ unset($_SESSION[$name]); } } }
(1)最經常使用的可能就是存放用戶的登陸信息了
(2)還有上面鳥哥說的存放優惠券等等瀏覽器
(1)千萬不要在服務端使用setcookie()存放數據,這樣很不安全安全
(2)session.auto_start = 0最好仍是使用0,若是是提供api服務的話,會生成不少session,佔用資源cookie
session一致性架構設計分佈式session存儲session