cookie,session入门笔记
cookie,session
如何创建cookie信息
把用户名密码保存到客户端的cookie
1 <?php
2 setCookie("name","zhangsan",time()+3600);
3 echo "保存成功!";
4 ?>
1、如果没有设置时间,cookie会失效。
2、cookie只能保存字符串。
3、客户端可以保存多个key=>vlaue对
4、cookie也可以保存中文,默认将会对中文urlencode();
5、cookie可以有多个key=>value对,可以给不同的键值,指定不同的有效时间
如何获取保存的cookie信息:
1 <?php
2 echo '<pre>';
3 var_dump($_COOKIE['name']);
4 ?>
1、如果cookie有效时间失效了,就取不到了。
2、客户端cookie信息是怎么传递给服务器的
通过http协议的Cookie:name=zhangsan 这个机制是http协议规定的。
如何更新cookie信息
1 <?php
2 setCookie("name","li4",time()+3600);
3 echo "更新成功!";
4 ?>
删除cookie信息
1、删除某个key=>value
代码:
1 <?php
2 setCookie('name','',time()-100);//减去的时间自己定
3 ?>
2、删除所有的key=>value
1 <?php
2 foreach($_COOKIE as $k=>$v){
3 setCookie($k,'',time()-100);
4 }
5 ?>
细节问:
1、如果你删除的cookie的key=>value没有删除完,则这个cookie在客户端保留,
如果你把这个网站的所有cookie删除,则客户端会把这个网站cookie文件删除。
例子:
记录上次登录时间:
1 <?php
2 if(!empty($_COOKIE['lastVisit']){
3 echo '您上次登录时间是:'.$_COOKIE['lastVisit'];
4 setCookie('lastVisit',date('Y-m-d H:i:s'),time()+24*3600*30);
5 }else{
6 echo '您是第一次登录!';
7 setCookie('lastVisit',date('Y-m-d H:i:s'),time()+24*3600*30);
8 }
9 ?>
//问题:有时候在现实上次登录的时候提示时区错误。
1.在php文件中设置 date_default_timezone_set('PRC');
2.在php.ini设置 date.timezone = PRC
如果客户端禁用cookie,服务器每次session_start(),都会创建有个全新的session文件,无法让多个页面共享一份session文件
解决方法:
session_start();
$sid = session_id();
1、在a链接上带上sessionid 如: <a href="test.php?PHPSESSID=$sid"></a>
2、不用获取session_id(),在a链接上直接带上SID 如: <a href="test.php?".SID></a>
3、session.use_trans_sid = 1;设置后重启apache,所有href,action,header都会自动带上SID
php.ini中关于cookie和session设置问题
1、session.name=名字//存放在cookie中的session名字
2、session.use_trans_sid = 0//给每个url启用session名=sessionid,不推荐开启。
3、session.save_path='c:/mysession';//session保存的路径
4、session保存的时间(三个是一组):
[
session.gc_maxlifetime = 1440;//默认最大生命周期(秒)
session.gc_probability = 1;//1000分之1
session.gc_divisor = 1000;//1000分
]
上面三个配置,来决定session垃圾回收机制,只要有session_start()动作,就会有1000分之一的概率调用垃圾回收机制
5、sessioncookie_lifetime = 0;//指定cookie默认生命周期,0表示关闭浏览器就过期。如果setCookie('name','value',time()+3600);就按设置时间
自定义会话处理器
1、为什么session文件都是以sess_*开头,能不能自定义?
2、能不能把session信息高效的保存到memcache中。
步骤:
1、session.save_handler = [files(存文件中)/user(自己处理)/memcache(内存中)/网络中]
自定义函数:
1 <?php
2 class FileSessionHandler
3 {
4 private $savePath;
5
6 function open($savePath, $sessionName)
7 {
8 $this->savePath = $savePath;
9 if (!is_dir($this->savePath)) {
10 mkdir($this->savePath, 0777);
11 }
12
13 return true;
14 }
15
16 function close()
17 {
18 return true;
19 }
20
21 function read($id)
22 {
23 return (string)@file_get_contents("$this->savePath/sess_$id");
24 }
25
26 function write($id, $data)
27 {
28 return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
29 }
30
31 function destroy($id)
32 {
33 $file = "$this->savePath/sess_$id";
34 if (file_exists($file)) {
35 unlink($file);
36 }
37
38 return true;
39 }
40
41 function gc($maxlifetime)
42 {
43 foreach (glob("$this->savePath/sess_*") as $file) {
44 if (filemtime($file) + $maxlifetime < time() && file_exists($file)) {
45 unlink($file);
46 }
47 }
48
49 return true;
50 }
51 }
52
53 $handler = new FileSessionHandler();
54 session_set_save_handler(
55 array($handler, 'open'),
56 array($handler, 'close'),
57 array($handler, 'read'),
58 array($handler, 'write'),
59 array($handler, 'destroy'),
60 array($handler, 'gc')
61 );
62
63 // 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为
64 register_shutdown_function('session_write_close');
65
66 session_start();
67 // 现在可以使用 $_SESSION 保存以及获取数据了
在php.ini中设置session.save_handler = user 表示用户自定义 就可以自定义session机制了。