- 简介
session,和cookie是一种存储数据的机制。
cookie的数据是存在客户端的,可以设置失效时间。默认关闭浏览器自动失效,如果设置了失效时间,即使关闭了浏览器cookie仍然会保留直到到期。
session的数据是存在服务器端的,既可以以文件的形式存到服务器上,也可以存到redis、memcached、SQLite。
下图是项目里面的session 文件。
它不是一个单一的文件,而是一大堆文件。sess_
后面的是session_id
。
http是无状态协议,一旦数据交换完毕,客户端与服务器端的链接就会关闭,再次交换数据需要建立新的链接。
那么用户登录成功之后,浏览器再向服务器请求数据是怎么知道这是哪个登陆的用户发的请求呢?这时候session_id
就起到关键的作用了。
只要每次请求的时候,服务器调用了session_start()
,就会自动从GET
或者POST
或者cookie
参数里面找PHPSESSID
【当然,这个名字是可以在服务器的php.ini
文件里面
,
或者在代码里通过ini_set("session.save_path", "my_PHPSESSID");
来修改】,然后找到对应的文件,读取登录成功时存到里面的用户信息。
如果GET
,POST
,cookie
里面都没有PHPSESSID
,服务器就会自动生成一个PHPSESSID
存到浏览器的cookie
里面。所以只要cookie
里面的PHPSESSID
是一致的,对应的就是同一个Session
。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session
。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie
,因此会共享一个Session
当会话自动开始或者通过 session_start()
手动开始的时候, PHP
内部会调用会话管理器的 open
和 read
回调函数。 会话管理器可能是 PHP
默认的, 也可能是扩展提供的(SQLite
或者 Memcached
扩展), 也可能是通过 session_set_save_handler()
设定的用户自定义会话管理器。 通过 read
回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP
会自动反序列化数据并且填充 $_SESSION
超级全局变量。
- 服务器操作cookie和session
PHP提供了大量的预定义变量,其中就有$_SESSION $_COOKIE
打印$_SESSION
可以看到本次链接的session_id对于的session数据
打印$_COOKIE
可以看到本次链接请求发送时浏览器的cookie,它和请求头里面的cookie是一致的。
setcookie(‘cookie_name’,’cookie_value’); 在服务器端设置浏览器的cookie【在第一次请求时,服务器上的代码里先setcookie ,然后打印立刻$_COOKIE
是看不到刚刚设置的cookie
的,只有在下一次请求才能看到】。
- 用途:
登陆功能【登录成功后将用户信息存到cookie里面】
长时间无操作自动下线功能【cookie的默认生命周期是到关闭浏览器,在保证session生命周期持久的情况下,只有关闭浏览器以后再重新访问才需要登录,一般情况下一直打开页面放在一边是不会掉线的。我们可以在每次请求时,往session里面记录当前请求时间,如果上次请求时间相隔太远,就清除登录信息】
保存用户浏览信息【保存用户的浏览记录什么的,保存购物车信息之类的】