一,cookie
1 PHP 透明地支持 HTTP cookie。cookie 是一种在远程浏览器端储存数据并以此来跟踪和识别用户的机制。可以用 setcookie() 或 setrawcookie() 函数来设置 cookie。cookie 是 HTTP 标头的一部分,因此 setcookie() 函数必须在其它信息被输出到浏览器前调用,这和对 header() 函数的限制类似。可以使用输出缓冲函数来延迟脚本的输出,直到按需要设置好了所有的 cookie 或者其它 HTTP 标头。
任何从客户端发送的 cookie 将会像 GET 和 POST 数据一样被自动的转换为 PHP 变量,该过程受 register_globals 和 variables_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 ( string name [, string value [, int expire [, string path [, string domain [, bool secure]]]]] )setcookie() 定义一个和其余的 HTTP 标头一起发送的 cookie。和其它标头一样,cookie 必须在脚本的任何其它输出之前发送(这是协议限制)。这需要将本函数的调用放到任何输出之前,包括 <html> 和 <head> 标签以及任何空格。如果在调用 setcookie() 之前有任何输出,本函数将失败并返回 FALSE。如果 setcookie() 函数成功运行,将返回 TRUE。这并不说明用户是否接受了 cookie。
注: 自 PHP 4 起,可以用输出缓存来在调用本函数前输出内容,代价是把所有向浏览器的输出都缓存在服务器,直到下命令发送它们。可以在代码中使用 ob_start() 及 ob_end_flush() 来实现这样的功能,或者通过修改 php.ini 中的 output_buffering 配置选项来实现,也可以通过修改服务器配置文件来实现。
除了 name 外,其它所有参数都是可选的。可以用空字符串("")替换某参数以跳过该参数。因为参数 expire 是整型,不能用空字符串掉过,可以用零(0)来代替 。下面的表格对 setcookie() 的每一个参数都进行了解释。
参数 | 说明 | 举例 |
name | cookie的名字 | 使用 $_COOKIE['cookiename'] 调用名为 cookiename 的 cookie。 |
value | cookie的值,此值保存在客户端,不要用来保存敏感数据 | 假定 name 是 'cookiename',可以通过 $_COOKIE['cookiename'] 取得其值。 |
expire | cookie过期的时间,这是个Unix时间戳.通常用time()函数再加上秒数来设定cookie的失效期.或者用mktime()来实现 | time()+60*60*24*30 将设定 cookie 30 天后失效。如果未设定,cookie 将会在会话结束后(一般是浏览器关闭)失效。 |
path | cookie在服务器端的有效路径 | 如果该参数设为 '/' 的话,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 仅在安全的连接中被设置。默认值为 FALSE。 | 0或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 上保存 TRUE 或 FALSE 时不应该直接使用 boolean 值,而应该用 0 来表示 FALSE,用 1 来表示 TRUE
-
可以把 cookie 的名称设置成一个数组,但是数组 cookie 中的每个元素的值将会被单独保存在用户的系统中。考虑使用 explode() 函数用多个名称和值设定一个 cookie。不推荐将 serialize() 用于此目的,因为它可能会导致一个安全漏洞。
二, 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();