作者:皇家突然回家_390 | 来源:互联网 | 2013-08-12 16:29
session原理及应用PHPer在学习session和cookie过程中,好多都是浅尝辄止,下面是笔者在学习session与cookie的一些整理内容,下面的内容对于PHP初学者人来说,是相当好的学习资源,相信没有一本PHP书介绍session与cookie有这么详细,当然笔者水平有限,如有理解不正确之处,还请网友及
session和COOKIE技术
PHP实现session PHP实现COOKIE
PHP中session与COOKIE学习整理
session原理及应用PHPer在学习session和COOKIE过程中,好多都是浅尝辄止,下面是笔者在学习session与COOKIE的一些整理内容,下面的内容对于PHP初学者人来说,是相当好的学习资源,相信没有一本PHP书介绍session与COOKIE有这么详细,当然笔者水平有限,如有理解不正确之处,还请网友及时留言,谢谢!
COOKIE与session学习整理
COOKIE概念:COOKIE是在远程浏览器端存储数据并以此来跟踪识别用户的机制。
session概念:session即会话,在计算机专业术语中,session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之前所经过的时间。因此session实际上是一个特定的时间段概念。
COOKIE工作原理:当远程客户端(即浏览器)A请求服务器B时,服务器B运行脚本文件,服务器B响应远程浏览器的请求,向远程客户端A发送包含COOKIE的响应报头,远程浏览器A接收到相应的COOKIE报头,远程浏览器A将相应的COOKIE数据写入到临时目录下的格式为“用户名@主机名[数字].txt”的一个文本文件;当远程浏览器A再次访问服务器B时(假设没有删除相应的COOKIE文件),浏览器分析临时目录的COOKIE文件,查找相应的域名及目录的COOKIE文件,并解析为标准的请求报头发送给服务器B,服务器B分析请求报头得知含有COOKIE数据,服务器B根据COOKIE数据进行相应的个性化网页的生成。通过上述的过程实现跟踪识别用户的机制,COOKIE技术是在远程浏览器端保存数据,安全级别低,不适合保存敏感数据。
session工作原理:当远程客户端A请求服务器B时,服务器B开启一个会话,同时生成一个会话ID用于唯一标识当前会话的一个字符串序列及保存会话数据的一个文本文件(这时讨论会话数据保存在文本文件中,此外还可以将会话数据保存到数据库),服务器B响应远程浏览器的请求,向远程客户端A发送包含COOKIE的响应报头(这里讨论会话ID通过COOKIE传递,此外还可以通过url传递会话ID),该COOKIE的名称为服务器B端设置的session名称,其值为会话ID,并且该COOKIE为会话COOKIE(保存在浏览器进程内存中,不存放在硬盘的文本文件中);远程客户端A再次请求服务器B时,远程客户端A将保存会话ID的COOKIE数据发送至服务器B,服务器B获得会话ID,根据会话ID在服务器B临时目录下查找相应的保存会话数据的文本文件,如果查找到,则读取会话数据正常通信,如果没有查找到则进行相应的错误处理(如:要求用户登录)。通过上述的过程实现了用户与服务器的会话通信,session技术需要用到COOKIE技术,session将会话数据保存到服务器端,更安全,更可靠。
PHP实现COOKIE技术
1.setCOOKIE ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httpOnly= false ]]]]]] )
功能:发送一个COOKIE
参数:$name COOKIE名称,意味着可以通过$_COOKIE[$name]的方式访问COOKIE数据
$value COOKIE的值
$expire COOKIE的有效时间,为unix时间戳,通常设置为time()+整型值
$path 设置COOKIE在$path目录有效
$domain 设置COOKIE的有效域如:xudianyang.gicp.net
$secure 为true或者1则在https连接上有效,为false或者0在http和https连接均有效
$httponly 该参数是PHP5.2新增的,为true或者1表示仅在http协议下被理解意味着像Javascript这样的脚本语言不能理解该COOKIE,为false或者0则没有限制
返回值:布尔值,成功返回true,失败返回false
注意:与setCOOKIE功能相似的一个函数为setrawCOOKIE ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httpOnly= false ]]]]]] ),该函数和setCOOKIE区别在于,setrawCOOKIE会将COOKIE数据进行url编码
2.删除COOKIE,只需要发送同样的一个COOKIE并将COOKIE的有效时间修改为过去的某个时间即可
3.访问COOKIE数据,通过超级全局变量$_COOKIE数组访问,该数组的键值为COOKIE的名称(注意:配置文件中variables_oder项目的值包括C,系统才会将浏览器发送来的COOKIE解析到$_COOKIE变量中)
PHP实现session技术
1.session_cache_expire([int $expire])
功能:设置或返回php.ini配置文件中session.cache_expire项目的值,如果提供$expire参数则为设置相应的值,否则返回相应的值
参数:$expire为设置的session.cache_expire项目的值,单位为分钟
返回值:整型值,session.cache_expire项目的设置值
注意:php.ini配置文件中session.cache_expire为设置会话页面在客户端的缓存时间,此项目受到php.ini配置文件session.cache_limiter项目的影响,session.cache_limiter为设置会话页面在客户端的缓存控制方式,其值可以为public,private,private_no_expire,nocache其中
public服务器将发送
Expires: (sometime in the future, according session.cache_expire)
Cache-Control: public, max-age=(sometime in the future, according to session.cache_expire,单位为秒)
Last-Modified: 文件最后修改时间(GMT时间格式)
的http响应报头且能被代理服务器和客户端缓存;
private服务器将发送
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=(session.cache_expire in the future), pre-check=(session.cache_expire in the future)
Last-Modified: 文件最后修改时间(GMT时间格式)
的http响应报头且能被客户端缓存;
private_no_expire服务器将发送
Cache-Control: private, max-age=(session.cache_expire in the future), pre-check=(session.cache_expire in the future)
Last-Modified: 文件最后修改时间(GMT时间格式)
的http响应报头且能被客户端缓存,private和private_no_expire的区别在于private_no_expire可以使客户端理解正确;
nocache服务器将发送
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
的http响应报头禁止客户端缓存会话页面
因此session.cache_expire的值当session.cache_expire配置项的值为public,private,private_no_expire才有效
由于php.ini配置文件中有session.cache_expire配置项,所以如果想在脚本运行时改变session.cache_expire的值,在每次调用session_start()之前就必须调用session_cache_expire()
2.session_cache_limiter ([ string $cache_limiter ] )
功能:设置或返回当前会话页面的缓存控制方式
参数:$cache_limiter可以为public,private,private_no_expire,nocache中的一个,具体介绍,请看session_cache_expire()
返回值:字符串型
注意:在session_start()调用之前调用session_cache_limiter()才有效
3.session_write_close ( void )
功能:写入会话数据结束会话
参数:无
返回值:无
注意:session_start()之后调用session_write_close()才有效,此函数的别名函数为session_commit()
4.session_encode(void)
功能:将当前会话数据编码为一个字符串
参数:无
返回值:字符串,返回编码后的一个字符串,不调用些函数PHP也会自动将编码的字符串写入会话文件中
注意:session_start()之后调用session_encode()才有效
5.session_decode(string $data)
功能:将session_encode()将当前会话数据编码
参数:$data为session_encode()将当前会话数据编码后字符串
返回值:布尔值,成功返回true,失败返回false
注意:session_start()之前调用session_decode()才有效
6.session_destroy(void)
功能:撤销所以注册会员变量数据
参数:无
返回值:布尔值,成功返回true,失败返回false
注意:在调用session_destroy()之前请通过调用setCOOKIE(session_name(),'',time()-42000)将已发送的会话ID从客户端删除,session_destroy()会删除会话ID并将服务器端保存会话数据的文件或者记录删除,session_start()之后调用session_destroy()才有效
7.session_get_COOKIE_params(void)
功能:返回会话COOKIE的信息
参数:void
返回值:数组,数组的格式为:
array (
'lifetime' => 0,//有效时间0表示该COOKIE为会话COOKIE,会话COOKIE是指COOKIE的生命周期为从会话开始到会话结束(关闭浏览器)
'path' => '/',//有效目录
'domain' => '',//有效域
'secure' => false,
'httponly' => false,
)
8.session_id([ string $id ])
功能:返回或设
置会话ID
参数:如果设置会话ID,则$id为设置的值
返回值:字符型
注意:session_start()之后调用session_id($id)才有效
9.session_is_registered(string $name)
功能:检测某个会话变量是否已经注册
参数:$name为会话变量名称
返回值:布尔值
注意:自 PHP 5.3.0 起,已经废弃此函数。强烈建议不要应用此函数
10.session_module_name([string $name])
功能:设置或返回session储存模块名称,默认为files是指将会话数据储存到文件系统,当为user时将采用用户自定义的方式储存会话数据
参数:$name为设置的储存模块名称
返回值:字符串型
11.session_name([string $name])
功能:设置或返回当前会话名称,其值会作为会话COOKIE名称
参数:$name为设置的会话名称
返回值:字符串型
12.session_regenerate_id([ bool $delete_old_session = false ])
功能:用新生成的会话ID更新当前会话ID,并保持当前会话信息
参数:$delete_old_session为true时删除旧的会话ID,为false时不删除旧的会话ID
返回值:布尔值
13.session_save_path([string $path])
功能:设置或返回session数据的保存路径
参数:$path为设置的路径
返回值:字符串型
注意:session_start()之前调用session_save_path()才有效
14.session_get_COOKIE_params(int $lifetime[,string $path[,string $domain[,bool $secure=false[,bool $httponly]]]])
功能:设置会话COOKIE的参数
参数:$lifetime为COOKIE的有效时间一个整型值单位秒
$path为COOKIE的有效目录
$domain为COOKIE有效域
$secure为1或者true时只在https连接下有效,为0或者false在http和https连接都有效
$httponly为1或者true时只有http连接或者https下有效,意味着像Javascript这样的脚本语言不能理解该COOKIE
返回值:无
注意:session_start()之前调用session_set_COOKIE_params()才有效
15.session_set_save_handler(callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc)
功能:设置用户自定义保存会话数据的函数句柄
参数:$open(string $save_path,string $name)
功能:打开储存会话数据的资源的函数
参数:该函数需要两个参数,第一个参数为session.save_path即会话数据的保存路径,第二个参数为 session.name即会话名称,这两个参数是PHP自动传递的
返回值:布尔值,成功返回true,失败返回false
$close
功能:关闭储存会话数据的资源的函数
参数:无
返回值:布尔值,成功返回true,失败返回false
$read(string $id)
功能:读取会话数据的函数
参数:该函数需要一个参数session.id即会话ID,该参数是PHP自动传递的
返回值:字符串型,该函数总是返回一个字符串,即使是一个空字符串
$write(string $id,string $value)
功能:写入会话数据的函数
参数:该函数需要两个参数第一个参数session.id即会话ID,第二个参数为写入的会话数据,两个参数是PHP自动传递的
返回值:布尔值,成功返回true,失败返回false,注意该函数内不能输出,要进行调试请输出到文件
$destroy(string $id)
功能:撤消会话变量
参数:该函数需要一个参数,session.id即会话ID
返回值:布尔值,成功返回true,失败返回false
$gc(int $lifetime)
功能:清除已失效的session
参数:该函数需要一个参数,$lifetime为session.gc_maxlifetime的值,即session的有效时间
返回值:布尔值,成功返回true,失败返回false
16.session_start(void)
功能:初始化会话
参数:无
返回值:布尔值,成功返回true,失败返回false
注意:建立会话页面时,一般情况下都必须先调用session_start()建立一个会话,由于在建立会话是会发送HTTP头,所以在session_start()之前不能有任何输出
17.session_unset(void)
功能:撤消所有的会话变量
参数:无
返回值:无
注意:如果使用$_SESSION,可以通过unset($_SESSION['name']),撤消单个会话变量,不要试图unset($_SESSION),这将导致$_SESSION不可用
18.session_write_close(void)
功能:写入会话数据并结束会话
参数:无
返回值:无