前言:
3.如何运行?
4.有生命周期吗?
5.关闭浏览器会过期吗?
6.Redis代替文件存储session
7.分布式session的同步问题
session是啥?
session的运行机制和是怎么保存的?
session_start();
这是个无任何返回值的函数,既不会报错,也不会成功。它的作用是开启session,并随机生成一个唯一的32位的session_id,类似于这样:4c83638b3b0dbf65583181c2f89168ec
session_start();
echo “SID: “.SID.”<br>”;
echo “session_id(): “.session_id().”<br>”;
echo "COOKIE: ". C O O K I E [ " P H P S E S S I D " ] ; < / s p a n > < / p > 我 们 访 问 一 下 a . p h p 页 面 , 看 能 输 出 什 么 ? < / d i v > < d i v s t y l e = " c o l o r : r g b ( 69 , 69 , 69 ) ; f o n t − f a m i l y : A r i a l ; f o n t − s i z e : 14 p x ; " > < s p a n s t y l e = " c o l o r : r g b ( 51 , 51 , 51 ) ; f o n t − f a m i l y : a r i a l , ′ 宋 体 ′ , s a n s − s e r i f ; l i n e − h e i g h t : 24 p x ; t e x t − i n d e n t : 28 p x ; " > < b r > < / s p a n > < / d i v > < d i v s t y l e = " c o l o r : r g b ( 69 , 69 , 69 ) ; f o n t − f a m i l y : A r i a l ; f o n t − s i z e : 14 p x ; " > < s p a n s t y l e = " c o l o r : r g b ( 51 , 51 , 51 ) ; f o n t − f a m i l y : a r i a l , ′ 宋 体 ′ , s a n s − s e r i f ; l i n e − h e i g h t : 24 p x ; t e x t − i n d e n t : 28 p x ; " > < i m g s r c = " h t t p s : / / i m g − b l o g . c s d n . n e t / 20141015104513437 ? w a t e r m a r k / 2 / t e x t / a H R 0 c D o v L 2 J s b 2 c u Y 3 N k b i 5 u Z X Q v d G h p b m s y b W U = / f o n t / 5 a 6 L 5 L 2 T / f o n t s i z e / 400 / f i l l / I 0 J B Q k F C M A = = / d i s s o l v e / 70 / g r a v i t y / S o u t h E a s t " a l t = " " s t y l e = " b o r d e r : n o n e ; " > < b r > < / s p a n > < / d i v > < d i v s t y l e = " c o l o r : r g b ( 69 , 69 , 69 ) ; f o n t − f a m i l y : A r i a l ; f o n t − s i z e : 14 p x ; " > 我 们 看 到 居 然 还 有 一 个 警 告 。 我 们 先 一 个 一 个 的 看 。 首 先 < s p a n s t y l e = " c o l o r : r g b ( 199 , 37 , 78 ) ; f o n t − f a m i l y : M e n l o , M o n a c o , C o n s o l a s , ′ C o u r i e r N e w ′ , m o n o s p a c e ; l i n e − h e i g h t : 26 p x ; " > S I D < / s p a n > 这 个 常 量 , 我 们 没 有 给 它 赋 值 , 它 居 然 能 有 输 出 , 其 次 < s p a n s t y l e = " c o l o r : r g b ( 199 , 37 , 78 ) ; f o n t − f a m i l y : M e n l o , M o n a c o , C o n s o l a s , ′ C o u r i e r N e w ′ , m o n o s p a c e ; l i n e − h e i g h t : 26 p x ; " > s e s s i o n i d ( ) < / s p a n > 这 个 系 统 方 法 是 输 出 本 次 生 成 的 s e s s i o n i d 。 最 后 _COOKIE["PHPSESSID"];</span></p>我们访问一下a.php页面,看能输出什么?</div><div style="color:rgb(69,69,69);font-family:Arial;font-size:14px;"><span style="color:rgb(51,51,51);font-family:arial, '宋体', sans-serif;line-height:24px;text-indent:28px;"><br></span></div><div style="color:rgb(69,69,69);font-family:Arial;font-size:14px;"><span style="color:rgb(51,51,51);font-family:arial, '宋体', sans-serif;line-height:24px;text-indent:28px;"><img src="https://img-blog.csdn.net/20141015104513437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhpbmsybWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none;"><br></span></div><div style="color:rgb(69,69,69);font-family:Arial;font-size:14px;">我们看到居然还有一个警告。我们先一个一个的看。首先<span style="color:rgb(199,37,78);font-family:Menlo, Monaco, Consolas, 'Courier New', monospace;line-height:26px;">SID</span>这个常量,我们没有给它赋值,它居然能有输出,其次<span style="color:rgb(199,37,78);font-family:Menlo, Monaco, Consolas, 'Courier New', monospace;line-height:26px;">session_id()</span>这个系统方法是输出本次生成的session_id。最后 COOKIE["PHPSESSID"];</span></p>我们访问一下a.php页面,看能输出什么?</div><divstyle="color:rgb(69,69,69);font−family:Arial;font−size:14px;"><spanstyle="color:rgb(51,51,51);font−family:arial,′宋体′,sans−serif;line−height:24px;text−indent:28px;"><br></span></div><divstyle="color:rgb(69,69,69);font−family:Arial;font−size:14px;"><spanstyle="color:rgb(51,51,51);font−family:arial,′宋体′,sans−serif;line−height:24px;text−indent:28px;"><imgsrc="https://img−blog.csdn.net/20141015104513437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGhpbmsybWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast"alt=""style="border:none;"><br></span></div><divstyle="color:rgb(69,69,69);font−family:Arial;font−size:14px;">我们看到居然还有一个警告。我们先一个一个的看。首先<spanstyle="color:rgb(199,37,78);font−family:Menlo,Monaco,Consolas,′CourierNew′,monospace;line−height:26px;">SID</span>这个常量,我们没有给它赋值,它居然能有输出,其次<spanstyle="color:rgb(199,37,78);font−family:Menlo,Monaco,Consolas,′CourierNew′,monospace;line−height:26px;">sessionid()</span>这个系统方法是输出本次生成的sessionid。最后_COOKIE[‘PHPSESSIID’] 没有值,这个我们接下来说。
KaTeX parse error: Expected 'EOF', got '&' at position 158: …同样的session_id :&̲nbsp;<span styl…_SESSION全局变量里写数据时,它会自动往这个文件里写入。读取session的时候,也会根据session_id 找到这个文件,然后读取需要的session变量。
echo “SID: “.SID.”<br>”;
echo “session_id(): “.session_id().”<br>”;
echo "COOKIE: ".$_COOKIE[“PHPSESSID”];
SID 是一个系统常量,SID包含着会话名以及会话 ID 的常量,格式为 “name=ID”,或者如果会话 ID 已经在适cookie 中设定时则为空字符串,第一次显示的时候输出的是SID的值,当你刷新的时候,因为已经在cookie中存在,所以显示的是一个空字符串。
[Session]
session.save_handler = files
session.save_path = “d:/wamp/tmp”
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440
主要我们用到的,常见的大概就是这几个。我们一个一个的说。
unset($_SESSION[‘hello’]);
session_unset();
session_destroy();
setcookie(session_name(), ‘’, time()-42000, ‘/’);
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440
- 更快的读取和写入速度。redis是直接操纵内存数据的,肯定是要比文件的形式快很多。
- 更好的设置好过期时间。文件存储的sess_sdewfrsf文件其实被删除掉还是要考运气的和概率的,很有可能造成sess_文件没即时删除,造成存储磁盘空间过多,和读取SESSION就变慢了。
- 更好的分布式同步。设置redis 的主从同步,可以快速的同步session到各台web服务器,比文件存储更加快速。
session.save_handler = redis
session.save_path = “tcp://127.0.0.1:6381”
需要用到tcp来连接redis,如果你设置reids 有密码访问的话,这样加上就可以了:tcp://127.0.0.1:6381?auth=authpwd
session_start(); //开启session,如果读不到cookie,会重新生成一个session_id,redis里面也会新生成一个。
echo “SID: “.SID.”<br>”;
echo “session_id(): “.session_id().”<br>”;
echo "COOKIE: ".$_COOKIE[“PHPSESSID”];
$_SESSION[‘hello’] = 123; // 写入session 。会序列化后写入redis中
$_SESSION[‘word’] = 456;
var_dump(
S
E
S
S
I
O
N
[
′
w
o
r
d
′
]
)
;
/
/
读
s
e
s
s
i
o
n
。
会
从
r
e
d
i
s
读
到
,
解
序
列
后
,
读
出
这
个
值
。
r
e
d
i
s
1440
秒
过
期
后
,
将
读
不
到
。
u
n
s
e
t
(
_SESSION['word']); //读session。会从redis读到,解序列后,读出这个值。redis 1440秒过期后,将读不到。 unset(
SESSION[′word′]);//读session。会从redis读到,解序列后,读出这个值。redis1440秒过期后,将读不到。unset(SESSION[‘hello’]); // 删除 hello 的session 。会删除 redis的hello值
session_unset(); // 清空redis 中这个session_id的所有值。
session_destroy(); // 删除掉这个PHPREDIS_SESSION:i9envsatpki9q8kic7m4k68os5 key。