【小白笔记】PHP学习之路 (31) --cookie和session

来源:互联网 发布:sybase数据库下载 编辑:程序博客网 时间:2024/05/22 10:36

setcookie()      设置一条cookie。如果指定第三个unix时间戳参数,可以指定cookie的保存时间,会被写入到文件中。

                           默认为0,为会话cookie(浏览器进程结束后被清除)。过期的cookie会被浏览器自动清除。第四个参数指定作用路径,默认为当前

                           目录及其子目录。header("Set-cookie:name=value")也可以设置cookie,默认为会话cookie。

                           *使用setcookie()来清除cookie时遵循就近原则。即当不指定作用路径时,优先作用于同目录机子目录的cookie。

                             如果不指定作用路径,在子目录下无法删除上级目录的cookie。

$_COOKIE[‘name’]      获得cookie。

ob_start()        打开输出控制缓冲。使用此函数后,如果在头信息之前有显示内容如echo等,则将其暂时放到缓冲区,

                         等到头信息提交完毕或缓冲区占满后再提交响应主体。

                         *注:如果php.ini中output_buffering设置为打开,那么缓冲区对整个脚本都有效。

ob_end()          关闭输出缓冲。

session会话的大致过程:

                          客户端访问页面,向服务器发送请求,服务器将会检查请求头部中是否含有session的id信息,如果没有,则

                          创建一个session,并在响应头中添加Set-cookie信息,将session id和session name写入客户端的cookie中。

                         之后客户端每次向服务器发出请求,都会把cookie 一起发送过去。服务器收到请求后仍然进行检查,如果存在

                         session信息,则会根据客户端发送过来的id信息查找对应的session并使用。此时服务器再返回响应,将不会

                        再向客户端写入cookie。 如果客户端禁止cookie写入的话,那么服务器每一次返回的响应头中都会包含Set-cookie信息。


session_start()      开始一个session。使用此函数后,如果客户端首次向服务器发送信息,则服务器会向客户端写入一个

                                  唯一地标识着客户端身份的cookie,之后客户端再访问服务器的时候就会将这个cookie发送到服务器,

                                  服务器将根据这个cookie在服务器上找到保存在session中的与之相关的信息。在PHP中,这个cookie

                                  标识默认名为PHPSESSID,可通过php.ini更改。也可以设置自动开启session。

session_name()      获取session的名称。如果传参,可以指定session的名称并使用,此时应使其在session_start()

                                    之前执行。

session_id()      获取session的id。如果传参,可以设定session的id,同时使用指定id的session。

                              如果通过地址栏传参的参数名与默认的session_name相同(可在php.ini中设置),那么PHP会自动解析该参数,

                              并把该参数的值作为session_id。可以在php.ini中session.use_only_cookies配置禁止使用这种地址栏session解析。

$_SESSION[‘name’]     从session中获取变量。

session_regenerate_id()      更新session的id,旧的session不会被删除,更新后原来的session信息仍然存在于新的session中。

删除session的方法:

                           可以使用unset()函数卸载内存中的session变量,

                           使用$_SESSION=array()来清空session。

                           session_unset()卸载已载入内存中的session,

                           session_destroy()彻底删除session(包括文件和session_id),同时可以使用setcookie(session_name(),'',1,'/')将客户端的

                           cookie设定为过期从而将其清除。

                           *由于session_destroy()会将session_id一起清除,而session_unset()依赖于session_id来找到内存中的session,

                           因此只有当session_unset()在session_destroy()之前执行时才会生效,使用时要注意这几步操作的先后顺序。


禁用cookie时session如何传递:

                           如果客户端禁用了cookie,服务器无法向客户端写入cookie,那么客户端不会向服务器发送session name和session id,

                           此时可以通过超链接或表单隐藏域来在不同页面间传递客户端的session id值。

                           方法1. 在php.ini中可以配置:session.use_trans_sid。开启此项后,如果session.use_only_cookies=0,PHP会解析URL,添加

                                        格式为session name=session id的字符串(可在url_rewirter.tags中设置自动转换的内容),将session信息添加到本页面所有

                                        符合条件的URL后面,即可实现cookie禁用后不同页面间的信息共享()。

                           方法2. 使用常量SID。如果session.use_trans_sid处于开启状态,那么可使用SID常量,它是一个格式为session name=session id

                                       的字符串,直接将其通过超链接传递到新页面即可。

                           方法3.自定义一个包含session信息的常量(或变量),将其通过表单隐藏域发送到新页面。

                           *如果使用方法一,那么需要确认php.ini中是否开启了session.use_only_cookies选项,如果开启,那么php将

                            不会对地址栏传递的含session name的字符串进行解析。此时需要使用方法二或方法三。

方法1:

<a href="new_page.php">new Page</a>      //session.use_trans_sid必须打开,session.use_only_cookies必须关闭。

方法2:

<a href="new_page.php?<?php echo SID;?>">new Page</a>  //此时必须保证php.ini中session.use_trans_sid处于开启状态。

方法3:

<?phpsession_start();$sid = isset($_COOKIE[session_name()])?"":"?".session_name()."=".session_id();               //如果客户端未开启cookie,则生成包含session信息的参数。define("DEF_SID",$sid); ?><a href="new_page.php<?php echo DEF_SID;?>">new Page</a>    //通过超链接的方式将session信息传递到新页面

*超链接传递session id的方法有一定的安全风险。

表单隐藏域传递:

<form name="sidForm" action="mew_page.php" method="post">      //可以通过ajax或iframe加上js实现自动提交同时页面不跳转的功能,这里就不写那么多了<input type="hidden" name="sid" value="<?php echo session_id();?>"/><input type="submit" value="提交"/></form>




0 0