您的位置:首页 > 编程语言 > PHP开发

PHP session和cookie的操作及使用

2008-09-02 15:41 656 查看
一,cookie

1 PHP 透明地支持 HTTP cookie。cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。可以用 setcookie()[/b]setrawcookie()[/b] 函数来设置 cookie。cookie 是 HTTP 标头的一部分,因此 setcookie()[/b] 函数必须在其它信息被输出到浏览器前调用,这和对 header()[/b] 函数的限制类似。可以使用输出缓冲函数来延迟脚本的输出,直到按需要设置好了所有的 cookie 或者其它 HTTP 标头。

任何从客户端发送的 cookie 将会像 GET 和 POST 数据一样被自动的转换为 PHP 变量,该过程受 register_globalsvariables_order 两个配置选项的影响。如果希望对一个 cookie 变量设置多个值,则需在 cookie 的名称后加 [] 符号。

在 PHP 4.1.0 及更高版本,自动全局变量数组 $_COOKIE 将总是包含所有从客户端发来的 cookie 数据。在老版本的 PHP 中,当 track_vars 配置选项打开时(此选项自 PHP 4.0.3 后总是打开的),系统为 cookie 设置的数组变量是 $HTTP_COOKIE_VARS。

2 setcookie -- 发送一个 cookie 信息

说明

bool setcookie[/b] ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )

setcookie()[/b] 定义一个和其余的 HTTP 标头一起发送的 cookie。和其它标头一样,cookie 必须在脚本的任何其它输出之前[/i]发送(这是协议限制)。这需要将本函数的调用放到任何输出之前,包括 <html> 和 <head> 标签以及任何空格。如果在调用 setcookie()[/b] 之前有任何输出,本函数将失败并返回 FALSE。如果 setcookie()[/b] 函数成功运行,将返回 TRUE。这并不说明用户是否接受了 cookie。

注: 自 PHP 4 起,可以用输出缓存来在调用本函数前输出内容,代价是把所有向浏览器的输出都缓存在服务器,直到下命令发送它们。可以在代码中使用 ob_start()[/b]ob_end_flush()[/b] 来实现这样的功能,或者通过修改 php.ini 中的 output_buffering 配置选项来实现,也可以通过修改服务器配置文件来实现。

除了 name 外,其它所有参数都是可选的。可以用空字符串(""[/i])替换某参数以跳过该参数。因为参数 expire 是整型,不能用空字符串掉过,可以用零(0[/i])来代替 。下面的表格对 setcookie()[/b] 的每一个参数都进行了解释。

参数 说明举例
namecookie的名字使用 $_COOKIE['cookiename'] 调用名为 cookiename 的 cookie。
valuecookie的值,此值保存在客户端,不要用来保存敏感数据假定 name 是 'cookiename',可以通过 $_COOKIE['cookiename'] 取得其值。
expirecookie过期的时间,这是个Unix时间戳.通常用time()函数再加上秒数来设定cookie的失效期.或者用mktime()来实现time()+60*60*24*30 将设定 cookie 30 天后失效。如果未设定,cookie 将会在会话结束后(一般是浏览器关闭)失效。
pathcookie在服务器端的有效路径如果该参数设为 '/' 的话,cookie 就在整个 domain 内有效,如果设为 '/foo/',cookie 就只在 domain 下的 /foo/ 目录及其子目录内有效,例如 /foo/bar/。默认值为设定 cookie 的当前目录。
domain该cookie有效的域名要使 cookie 能在如 example.com 域名下的所有子域都有效的话,该参数应该设为 '.example.com'。虽然 . 并不必须的,但加上它会兼容更多的浏览器。如果该参数设为 www.example.com 的话,就只在 www 子域内有效。细节见 Cookie 规范中的 tail matching。
secure指明cookie是否仅通过安全的 HTTPS 连接传送。当设成 TRUE 时,cookie 仅在安全的连接中被设置。默认值为 FALSE0或1
3 具体操作

a, 设置Cookie:

SetCookie("MyCookie", "Value of MyCookie");
  带失效时间的:
  SetCookie("WithExpire", "Expire in 1 hour", time()+3600);//3600秒=1小时
  什么都有的:
  SetCookie("FullCookie", "Full cookie value", time()+3600, "/forum", ".phpuser.com", 1);

b, 输出Cookie:

echo $MyCookie;
  echo $CookieArray[0];
  echo count($CookieArray);
  echo $HTTP_COOKIE_VARS["MyCookie"];
echo $_COOKIE['MyCookie'];

c, 删除Cookie:

要删除 cookie 需要确保它的失效期是在过去,才能触发浏览器的删除机制。

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);

4 常见缺陷:

Cookies 不会在设置它的本页生效,要测试一个 cookie 是否被成功的设定,可以在其到期之前通过另外一个页面来访问其值。过期时间是通过参数 expire 来设置的。可以简单地使用 print_r($_COOKIE); 来调试现有的 cookies。

Cookie 必须用和设定时的同样的参数才能删除。如果其值一个空字符串,或者是 FALSE,并且其它的参数都和前一次调用 setcookie 时相同,那么所指定名称的 cookie 将会在远程客户端被删除。

由于把 cookie 的值设为 FALSE 会使客户端尝试删除这个 cookie,所以要在 cookie 上保存 TRUEFALSE 时不应该直接使用 boolean 值,而应该用 0[/i] 来表示 FALSE,用 1[/i] 来表示 TRUE

可以把 cookie 的名称设置成一个数组,但是数组 cookie 中的每个元素的值将会被单独保存在用户的系统中。考虑使用 explode()[/b] 函数用多个名称和值设定一个 cookie。不推荐将 serialize()[/b] 用于此目的,因为它可能会导致一个安全漏洞。

二, Session

1 Session原理:

Session储存于服务器端(默认以文件方式存储session),根据客户端提供的session id来得到用户的文件,取得变量的值,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。
PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,即“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”。

2 Session操作:

2.1 session_start():

说明:初始化一个新的Session,若客户已在Session中,则连上原Session.

2.2 session_destroy():

说明:消毁session变量

2.3 session_name(str):

说明:设置或获取当前的session名称,不带参数时为获取session名称

具体用法:

设置: session_name("session name");
获取: echo session_name(); //将会输出session name,如果没有设置则输出默认的PHPSESSID

2.4 session_save_path([path])

说明:必须在session_start函数之前被调用

无参数时: 表示获取目前存放session的路径目录名

有参数时: 表示将session存在新的目录中

2.5 session_id([id]):

说明:有无参数均会返回session的代号

无参数时:表示取得目前session的代号

有参数时:表示将参数设置成当前session的代号

2.6 session_register(str)

说明:增加一个新的变量到当前的session中

示例: $temp="test session";

session_register("temp");

2.7 session_unregister(str)

说明:在目前的session变量中删除名为str的变量,这里是彻底删除

2.8 session_is_registered(name)

说明:检验name变量在session中是否已经被注册

2.9 session_encode()

说明:返回一个含有被编码的当前会话数据的字符串

2.10 session_decode(data)

说明:将session资料(data)解码,成功则返回true值

3 设置session的生存时间

说明:注意下面两个session_start()执行的位置

a,

session_start();

$life_time=24*3600;

setcookie(session_name(),session_id(),time()+$life_time,"/");

b,

$life_time=24*3600;

session_set_cookie_params($life_time);

session_start();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: