PHP学习笔记——会话管理

一、cookie管理
1、介绍cookie
cookie是在HTTP协议下,将服务器传递给浏览器的少量数据保存到用户浏览器的一种方式,通过这种方式,即使在浏览器被关闭和连接中断的情况下,用户仍然可以维护状态数据。cookie是保存在用户硬盘上的由字符串组成的小文本文件,其命名格式如下:
用户名@网站地址[数字].txt
cookie中的内容大多警告了加密处理,因此,表面上看来只是一些字母和数字组合,而只有服务器的CGI处理程序才知道它们的真正含义。cookie常用于以下3方面:
1)记录访客的某些信息;
2)在页面之间传递变量;
3)将所查看的Internet页存储在cookie临时文件夹中,可以提高以后浏览器的速度。

2、创建cookie
在PHP中通过setcookie()函数创建cookie,至少接受一个参数,即cookie的名称(如果只设置了名称参数,那么在远程客户端上的同名cookie会被删除)。
bool setcookie ( string name [, string value = “” [, int expire = 0 [, string path = “” [, string domain = “” [, bool secure = false [, bool httponly = false ]]]]]] )
setcookie() 定义了 cookie,会和剩下的 HTTP 头一起发送给客户端。 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送 cookie(cookie是经由服务器的程序通过HTTP请求和响应发送到浏览器的,是HTTP头标的组成部分,而头标必须在页面其他内容之前发送。)。 请在产生任何输出之前(包括 和 或者空格)调用本函数。一旦设置 Cookie 后,下次打开页面时可以使用 $_COOKIE 读取。 Cookie 值同样也存在于 $_REQUEST。
参数name是cookie 名称。
参数value是cookie 值。 这个值储存于用户的电脑里,请勿储存敏感信息。 比如 name 是 ‘cookiename’, 可通过 $_COOKIE[‘cookiename’] 获取它的值。
参数expire是cookie 的过期时间。 这是个 Unix 时间戳,即 Unix 纪元以来(格林威治时间 1970 年 1 月 1 日 00:00:00)的秒数。 也就是说,基本可以用 time() 函数的结果加上希望过期的秒数。 或者也可以用 mktime()。 time()+606024*30 就是设置 Cookie 30 天后过期。 如果设置成零,或者忽略参数, cookie 会在会话结束时过期(也就是关掉浏览器时)。
参数path是cookie 有效的服务器路径。 设置成 ‘/’ 时,cookie 对整个域名 domain 有效。 如果设置成 ‘/foo/’, cookie 仅仅对 domain 中 /foo/ 目录及其子目录有效(比如 /foo/bar/)。 默认值是设置 cookie 时的当前目录。
参数domain是cookie 的有效域名/子域名。 设置成子域名(例如 ‘www.example.com’),会使 cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。 要让 cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 ‘example.com’)。
参数secure设置这个 cookie 是否仅仅通过安全的 HTTPS 连接传给客户端。 设置成 TRUE 时,只有安全连接存在时才会设置 cookie。 如果是在服务器端处理这个需求,程序员需要仅仅在安全连接上发送此类 cookie (通过 $_SERVER[“HTTPS”] 判断)。
参数httponly设置成 TRUE,cookie 仅可通过 HTTP 协议访问。 意思是 cookie 无法通过类似 JavaScript 这样的脚本语言访问。 要有效减少 XSS 攻击时的身份窃取行为,可建议用此设置(虽然不是所有浏览器都支持),不过这个说法经常有争议。 PHP 5.2.0 中添加。
注意,HTTP协议规定,每个站点向单个用户最多只能发送20个cookie。在发送 Cookie 时,值的部分会被自动 urlencode 编码。收到 Cookie 时,会自动解码,并赋值到可变的 Cookie 名称上。 如果不想被编码,可以使用 setrawcookie() (PHP5以上支持)代替。

3、读取cookie
在PHP中通过超级全局数组$_COOKIE[]来读取浏览器端的cookie值。

4、删除cookie
1)使用setcookie()函数删除cookie
删除cookie只需要将setcookie()函数中的第二个参数设置为空值,第三个参数将cookie的过期时间设置为小于系统的当前时间即可。
2)应用浏览器手动删除cookie

5、cookie应用的注意事项
1)在应用setcookie()函数创建cookie之前,不能有任何HTML输出,即使是空格、空行也不行;
2)通过setcookie()函数创建cookie后,在当前页面应用echo $_COOKIE[“name”]不会有任何输出,必须在刷新后或到达下一个页面时才可以看到cookie值(如果不刷新或浏览下一个页面,客户端不能将cookie送回);
3)使用cookie的限制,一个浏览器能创建的cookie数量最多为30个,并且每个cookie的容量不能超过4KB,每个Web站点能设置的cookie总数不能超过20个。
4)cookie是保存在客户端的,如果用户禁止使用cookie,那么cookie就失去作用了(浏览器会拦截cookie,并且询问用户是否允许cookie进门)。

二、session管理
与cookie相比,会话能够管理大量数据,而且可以将信息保存在服务器端,相对更安全,并且也没有存储长度的限制。
1、介绍session
session从用户访问页面开始,到断开与网站连接为止,形成session的生命周期。用户每一次连接时,PHP都会自动生成一个唯一的sessionID以标识当前用户,与其他用户进行区分。
sessionID可以作为会话信息保存到数据库中,作为主键来区分不同的用户,或作为服务器端的会话文件名称中的唯一字符串,这样可以跟踪每个用户的登录次数、在线与否,或计算用户的在线时间。
session会话时,sessionID会分别保存在客户端和服务器端两个位置。在客户端,使用临时的cookie保存在浏览器指定目录(session cookie);在服务器端,以文本文件形式保存在指定的session目录中。由于网页是一种无状态的连接程序,因此无法记录用户的浏览状态,必须通过session记录用户的有关信息,以供用户再次以此身份对Web服务器提供要求时作为确认。

2、启动session
1)通过session_start()函数创建会话
bool session_start ([ array options = array() ] )
启动新会话或者重用现有会话,如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID, 则会重用现有会话。
当会话自动开始或者通过 session_start() 手动开始的时候, PHP 内部会调用会话管理器的 open 和 read 回调函数。 会话管理器可能是 PHP 默认的, 也可能是扩展提供的(SQLite 或者 Memcached 扩展), 也可能是通过 session_set_save_handler() 设定的用户自定义会话管理器。 通过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP 会自动反序列化数据并且填充 $_SESSION 超级全局变量。要想使用命名会话,请在调用 session_start() 函数 之前调用 session_name() 函数。如果启用了 session.use_trans_sid 选项, session_start() 函数会注册一个内部输出管理器, 该输出管理器完成 URL 重写的工作。
参数options是一个关联数组,如果提供,那么会用其中的项目覆盖 会话配置指示 中的配置项。此数组中的键无需包含 session. 前缀。除了常规的会话配置指示项, 还可以在此数组中包含 read_and_close 选项。如果将此选项的值设置为 TRUE, 那么会话文件会在读取完毕之后马上关闭, 因此,可以在会话数据没有变动的时候,避免不必要的文件锁。
成功开始会话返回 TRUE ,反之返回 FALSE。

2)通过session_register()函数创建会话
session_register()函数用来为会话登录一个变量来隐含地启动会话,但要求设置php.ini文件的选项,将register_globals指令设置为“on”,然后重新启动Apache服务器。使用session_register()函数时,不需要调用session_start()函数,PHP会在注册变量之后隐含地调用session_start()函数。会话变量启动后,全部被保存在全局数组 S E S S I O N 中 。 通 过 全 局 数 组 _SESSION中。通过全局数组 SESSION_SESSION创建一个会话,只需要直接给该数组添加一个元素即可。成功时返回 TRUE, 或者在失败时返回 FALSE。 注意,本函数已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。

3、删除session
1)删除单个会话
删除会话变量,同数组的操作一样,直接注销 S E S S I O N 数 组 的 某 个 元 素 即 可 , 如 u n s e t ( _SESSION数组的某个元素即可,如unset( SESSIONunset(_SESSION[‘name’])。注意,应用unset()函数时,要注意 S E S S I O N 数 组 中 的 某 元 素 不 能 省 略 , 即 不 可 一 次 注 销 整 个 数 组 , 这 样 会 禁 止 整 个 会 话 的 功 能 , 如 果 使 用 u n s e t ( _SESSION数组中的某元素不能省略,即不可一次注销整个数组,这样会禁止整个会话的功能,如果使用unset( SESSION使unset(_SESSION)会将全局变量 S E S S I O N 销 毁 , 而 且 没 有 办 法 将 其 恢 复 , 用 户 也 不 能 再 注 册 _SESSION销毁,而且没有办法将其恢复,用户也不能再注册 SESSION_SESSION变量。

2)删除多个会话
如果要一次注销所有的会话变量,可以将一个空的数组赋值给$_SESSION。

3)结束当前会话
如果整个会话已经结束,首先应注销所有的会话变量,然后使用session_destroy()函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁session。
bool session_destroy ( void ) 销毁当前会话中的全部数据, 但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。 如果需要再次使用会话变量, 必须重新调用 session_start() 函数。成功时返回 TRUE, 或者在失败时返回 FALSE。

你可能感兴趣的:(编程知识)