Cookie
一、了解Cookie
Cookie是在HTTP协议下,通过服务器或脚本语言可以维持客户浏览器上信息的一种方式。Cookie是一种客户浏览器端储存数据并以此来跟踪和识别用户的机制。Cookie是Web服务器暂时储存在用户硬盘上的一个文本文件,并随后被Web浏览器读取。Cookie文件中的内容大多都经过了加密处理。只有服务器的CGI处理程序才知道它们真正的含义。
二、Cookie的功能
- 记录访客的某些信息。记录用户访问网页的次数,或者记录访客曾经输入过的信息。另外,某些网站以可使用Cookie自动记录访客上次登陆的用户名。
- 在页面之间传递变量。浏览器并不会保存当前页面上的任何变量信息,当页面被关闭时页面上的所有变量信息将随之消失。如果用户需要把一个变量传递到另一个页面,可以把这个变量保存以Cookie形式保存下来,然后下一页通过读取该Cookie来获取该变量的值。
- 将所查看的Internet页存储在Cookie临时文件夹中,可以提高以后浏览的速度。
三、创建Cookie
在PHP中通过setcookie( ) 函数创建Cookie,Cookie是HTTP头标的组成部分,而头标必须在页面其他内容之前发送,因此它必需最先输出。若在setcookie( ) 函数前输出一个HTML标记、echo语句,甚至一个空行都会导致程序错误。
语法:bool setcookie(string name[, stirng value[, int expire[, string path[, string domain[, int secure]]]]]);
参数:
- name:Cookie的变量名,可以通过$_COOKIE["cookiename"]调用变量名为cookiename的Cookie
- value:Cookie变量的值。该值保存在客户端,不能用来保存敏感信息,通过$_COOKIE["values"]获取名为values的值
- expire:Cookie的失效时间,expire是标准的UNIX事件标记,可以用time( )函数或mktime( )函数获取,单位为秒。如果不设置Cookie的失效时间,那么在会话期间内Cookie将永远有效,除非手动删除。
- path:Cookie在服务器端的有效路径。如果该参数设置为"/",则它在整个domain内有效,如果设置为"/11",它在domain下的/11目录及子目录内有效。默认是当前目录。
- domain:Cookie有效的域名。如果要使Cookie在mrbcd.com域名下的所有子域都有效,应该设置为mrbcd.com
- secure:知名Cookie是否仅通过安全的HTTPS,值为0或1。如果值为1,则Cookie只能在HTTPS连接上有效;如果值为默认值0,则Cookie在HTTP和HTTPS连接上均有效。
四、读取Cookie
语法:$_COOKIE[name];
五、删除Cookie
当Cookie被创建后,如果没有设置它的失效时间,其Cookie文件会在关闭浏览器时被自动删除。如果要在关闭浏览器之前删除Cookie文件,方法有两种:一种是使用setcookie( )函数删除,另外一种是在浏览器中手动删除cookie。
1. 使用setookie( ) 函数删除Cookie
删除Cookie和创建Cookie的方式基本类似,删除Cookie也使用setcookie( ) 函数。删除Cookie只需要将setcookie( ) 函数中的第二个参数设置为空值,将第三个参数Cookie的失效时间设置小于系统当前时间即可(把失效时间设置为0,也可以直接删除Cookie)。
语法:setcookie("name", "", time( ) -1);
2. 在浏览器中手动删除Cookie
在浏览器中打开”开发者工具模式“,在network或者调试程序中找到cookie文件(因为不同的浏览器cookie的位置不同),然后手动删除需要删除的cookie即可。
Session
一、了解Session
Session是指一个终端用户与交互系统进行通信的时间间隔,通常是指从进入系统到注销退出系统所经过的事件。
工作原理:当启动一个Session会话时,会生成一个随机且唯一的Session_id,也就是Session的文件名,此时Session_id储存在服务器内存中,当关闭页面时此id会自动注销,重新登陆此页面,会再次生成一个随机且唯一的id。
功能:由于网页是一种无状态的连接程序,因此无法得知用户的浏览状态。通过Session则可记录用户的相关信息,一共用户再次以此身份对Web服务器提交要求时作确认。
二、创建会话
创建一个会话需要通过一下步骤:启动会话 -> 注册会话 -> 使用会话 -> 删除会话
1. 启动会话
启动PHP会话有两种方式:一种使用session_start( ) 函数,另一种用session_register( ) 函数为会话创建一个变量来隐含地启动会话。
- 使用session_start( ) 函数启动会话
语法:bool session_start(void);使用session_start( )函数之前浏览器不能有任何输出。
- 使用session_register( ) 函数创建会话
session_register( )函数用来为会话创建一个变量来隐含地启动会话,但要求php.ini文件的选项,及将register_globals指令设置为on,然后重新启动Apache服务器即可。
使用session_register( )函数,不需要调用session_start( ) 函数,PHP会在创建变量之后隐含地调用session_start( ) 函数。
2. 注册会话
会话变量被创建后,全部保存在数组$_SESSION中,通过数组$_SESSION创建一个会话变量很容易,只要直接给该组添加一个元素即可。
语法:$_SESSION[name] = value;
3. 使用会话
首先需要判断会话变量是否有一个会话ID存在,如果不存在,就创建一个,并且使其能够通过全局数组$_SEEION进行访问。如果已经存在,则将这个已经创建的会话变量载入以供用户使用。
4. 删除会话
删除会话的方法主要有删除单个会话、删除多个会话和结束当前会话3种
- 删除单个会话
删除单个会话即删除单个会话变量,同数组的操作一样,直接注销$_SESSION数组的某个元素即可
语法:unset($_SESSION["user"]);
- 删除多个会话
删除多个会话即一次注销所有的会话变量,可以铜鼓将一个空的数组赋值给$_SESSION来实现
语法:$_SESSION = array();
- 结束当前会话
整个会话已经结束,首先应该注销所有的会话变量,然后使用session_destroy()函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁Session。
语法:session_destroy( );
五、Session设置事件
1. 客户端没有禁止Cookie
- 使用session_set_cookie_params()设置Session的失效时间。
- session_set_cookie_params()必需session_start()之前调用;
- 不推荐使用此函数,此函数在一些浏览器上会出现问题,所以一般手动设置失效时间。
- 使用setcookie()函数可对Session设置失效时间。失效时间和Cookie失效时间一样。
2. 客户端禁止Cookie
当客户端禁用Cookie时,Session页面间传递会失效,解决方法有4种
- 登陆之前提醒用户必需打开Cookie,这是很多论坛的做法。
- 设置php.ini文件中的session_use_trans_sid = 1,或者编译时打开-enable-trans-sid选项,让PHP自动跨页面传递session_id。
- 通过GET方法,隐藏表单传递session_id。
- 使用文件或者数据库储存session_id,在页面间传递中手动调用。
六、Session临时文件
在服务器中,如果将所用用户的Session都保存到临时目录下,会降低服务器的安全性和效率,打开服务器存储的站点会非常慢。在PHP中,使用函数session_save_path()可以解决这个问题。
session_save_path()函数应在session_start( )函数之间调用。
七、Session缓存
Session缓存是将网页中的内容临时存储到IE客户端Temporary Internet Files文件夹下,并且可以设置缓存时间。如果再次访问网页可以直接读取缓存中的内容,从而提高网站的浏览效率。
Sessin缓存使用session_cache_limiter( ) 函数。
语法:string session_cache_limiter([string cache_limiter]);
参数:cache_limiter为public或private,同时Session缓存并不是指在服务器端而是在客户端缓存,在服务器中没有显示。
缓存时间的设置,使用session_cache_expire( ) 函数。
语法:int session_cache_expire([int new_cache_expire]);
参数;new_cache_expire是Session缓存的时间,单位为分钟。
这两个Session缓存函数必须在session_start( )调用之前使用,这两个函数添加参数为设置,不加参数表示为读取。
八、Session数据库存储
解决Session存储文件将临时文件夹填满而造成瘫痪,用到Session数据库存储。也就是PHP中session_set_save_handler( )函数
语法:bool session_set_save_handler(string open, string close, string read, string write,string destroy, string gc);
参数:
- open(save_path, session_name),找到Session存储地址,取出变量名称
- close(),不需要参数,关闭数据库
- read(key),读取Session键值,key对应session_id。
- write(key, data),其中data对应设置的Session变量
- destroy(key),注销Session对应Session键值。
- gc(expire_time),清除过期Session记录。
function _session_open($save_path, $session_name){
global $handle;
// 连接MySQL数据库
$handle = mysqli_connect('localhost', 'root', 'root') or die("数据库连接失败");
// 找到数据库
mysql_select_db('test', $handle) or die("数据库中没有此库名");
return(true);
}
function _session_close(){
global $handle;
mysql_close($handle);
return(true);
}
function _session_read($key){
global $handle;
$time = time();
$sql = "select session_data from tb_session where session_key = '$key' and session_time > $time";
$result = mysql_query($sql, $handle);
$row = mysql_fetch_array($result);
if($row){
return ($row['session_data']);
}else{
return(false);
}
}
function _session_write($key, $data){
global $handle;
// 设置失效时间
$time = 60*60;
$lapse_time = time()+$time;
$sql = "select session_data from tb_session where session_key = '$key' and session_time > $lapse_time";
$result = mysql_query($sql, $handle);
if(mysql_num_rows($result) == 0){
$sql = "insert into tb_session values('$key', '$data', '$lapse_time')";
$result = mysql_query($sql, $handle);
}else{
$sql = "update tb_session set session_key = '$key', session_data = '$data',session_time = $lapse_time where session_key ='$key'";
$result = mysql_query($sql, $handle);
}
return($result);
}
function _session_destroy($key){
global $handle;
$sql = "delete from tb_session where session_key ='$key'";
$result = mysql_query($sql, $handle);
return($result);
}
function _session_gc($expiry_time){
global $handle;
$lapse_time = time();
$sql = "delete from tb_session where expiry_time<$lapse_time";
$result = mssql_query($sql, $handle);
return($result);
}
session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc');
$_SESSION["user"] = "mr";
$_SESSION["pwd"] = 'mrsoft';