- session 與 cookie 的關(guān)系
1.session 是存在服務(wù)端的伯复,cookie 是存在客戶端的。session 是基于cookie 才會存在的。
2.session 必須至少存在一條數(shù)據(jù),瀏覽器上才會有 cookie 值存在
3.cookie 的鍵逆趣,是由 php.ini 中的 session.name 參數(shù)決定的,這個是識別用戶用的惠险,客戶端和服務(wù)端都有這個值
4.客戶端的cookie 鍵和值與服務(wù)端的 cookie 鍵值都是一致的诡蜓。
5.session 數(shù)據(jù)可以存在任何地方诽表,如果redis中,直接使用 get 即可取出數(shù)據(jù)
6.session 存在 redis 中就可以解決同域名(但二級域名不同)的跨域問題诗舰。比如 a.test.com 警儒, b.test.com
1.
SESSION
是保存到了服務(wù)器上,而cookie
是保存在了客戶端
2.PHPSESSID
是保存在cookie
里面
3.SESSION
是根據(jù)PHPSESSID
值來識別用戶的
4.同一個瀏覽器的PHPSESSID
值是固定的,正是因?yàn)檫@樣眶根,才識別了用戶的session
5.拿到PHPSESSID
值蜀铲,就可以拿到本服務(wù)器上
本客戶的所有session
值
6.多臺服務(wù)器之間共享SESSION
其實(shí)是要做到PHPSESSID
共享
7.PHPSESSID
只要不關(guān)閉網(wǎng)頁,怎么刷新都是一樣
8.在 PHP 中属百,保存 session_id 的 cookie 名稱默認(rèn)叫作PHPSESSID
蝙茶,這個名稱可以通過 php.ini 中session.name
來修改,也可以通過函數(shù)session_name()
來修改诸老。
無論是通過調(diào)用函數(shù) session_start() 手動開啟會話隆夯, 還是使用配置項(xiàng) session.auto_start 自動開啟會話, 對于基于文件的會話數(shù)據(jù)保存(PHP 的默認(rèn)行為)而言别伏, 在會話開始的時候都會給會話數(shù)據(jù)文件加鎖蹄衷, 直到 PHP 腳本執(zhí)行完畢或者顯式調(diào)用 session_write_close() 來保存會話數(shù)據(jù)。 在此期間厘肮,其他腳本不可以訪問同一個會話數(shù)據(jù)文件愧口。
對于大量使用 Ajax 或者并發(fā)請求的網(wǎng)站而言,這可能是一個嚴(yán)重的問題类茂。 解決這個問題最簡單的做法是如果修改了會話中的變量耍属, 那么應(yīng)該盡快調(diào)用
session_write_close()
來保存會話數(shù)據(jù)并釋放文件鎖。 還有一種選擇就是使用支持并發(fā)操作的會話保存管理器來替代文件會話保存管理器巩检。
-
php.ini
中的session配置
[Session]
session.save_handler = files
session.save_path = "/tmp"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0 // 發(fā)送到瀏覽器的 cookie 的生命周期
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440
- 如果使用
redis
存儲厚骗。memcache 存儲的設(shè)置是一樣的
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6381" // 也可以不不添加 tcp
需要用到tcp來連接redis,如果你設(shè)置reids 有密碼訪問的話兢哭,這樣加上就可以了:
tcp://127.0.0.1:6381?auth=authpwd
session同步
在做了web集群后领舰,你肯定會首先考慮session同步問題,
因?yàn)橥ㄟ^負(fù)載均衡后迟螺,同一個IP訪問同一個頁面會被分配到不同的服務(wù)器上冲秽,
如果不同的服務(wù)器用的是不同的redis服務(wù),那么可能就會出現(xiàn)矩父,一個登錄用戶锉桑,一會是登錄狀態(tài),一會又不是登錄狀態(tài)窍株。
所以session這個時候就要同步了民轴。剛好郑诺,我們選擇用redis作為了存儲,是可以在多臺redis 服務(wù)器中同步的杉武。
具體可以搜索 reidis主從同步或者redis 集群
為什么重啟瀏覽器后 Session 數(shù)據(jù)就取不到了
session.cookie_lifetime
以秒數(shù)指定了發(fā)送到瀏覽器的 cookie 的生命周期。值為 0 表示"直到關(guān)閉瀏覽器"辙售。默認(rèn)為 0轻抱。
如何設(shè)置一個嚴(yán)格30分鐘過期的Session
使用memcache, redis等,因?yàn)樗麄儽旧砭椭С诌^期時間設(shè)置,他們又是鍵值對存儲方式
1. 設(shè)置Cookie過期時間30分鐘, 并設(shè)置Session的lifetime也為30分鐘.
2. 自己為每一個Session值增加Time stamp.
3. 每次訪問之前, 判斷時間戳.
最后, 有同學(xué)問, 為什么要設(shè)置30分鐘的過期時間: 這個, 首先這是為了面試, 第二, 實(shí)際使用場景的話, 比如30分鐘就過期的優(yōu)惠劵?
- 銷毀 session
session_unset();
session_destroy();
- 重新生成 session_id()
session_regenerate_id();