cookie和session

Posted cscsdvdsv

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cookie和session相关的知识,希望对你有一定的参考价值。

cookie

设置

设置 cookie,发送一个cookie到客户端
语法:bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )
参数:
$name,COOKIE名称;
$value,COOKIE的值;
$expire,有效期,默认是0.设置time()+3600,表示3600秒后失效.php_INT_MAX表示不失效,time()-1表示删除cookie
$path,有效路径.默认是网站根目录”/”, 上级目录能找到.当前域名可以访问.一般会设置,比如’/upload’表示只能在upload目录及其子目录下使用
$domain,有效域名。
$secure,是否仅能使用https来传送COOKIE.默认值是false,可以使用http发送cookie
$httponly,是否只能通过http协议来使用COOKIE.默认false.其他程序也能使用cookie.如js. document.cookie来读取

注意:设置cookie的名称一般是字符串,可以是” 数组形式”名字,不能是其他类型.值也是字符串,不能是其他类型.如果使用数组形式的cookie名称,该名称不能加引号

比如:$n=setcookie(“arr[name]”,”123”);		$v=setcookie(“arr[yes]”,”456”);
echo $_COOKIE[‘arr’][‘name’],”<br />”;		echo $_COOKIE[‘arr’][‘yes’];

读取

读取cookie:用$_COOKIE[‘’],如果名字是数组形式,读取用$_COOKIE[‘’][‘’]

删除

删除cookie:设置有效期为过去时间,或者把第二个参数,cookie设置为false或者设置为’’又或者不设置cookie值

总结

总结
setcookie(键,值,有效期=0,有效路径='',有效域名='',是否仅安全连接传输=false,是否HTTPonly=false)
有效路径:/为整站有效;有效域名: .kang.com 在所有kang.com下的子域名都有效

Session

session属性

有效期:默认关闭浏览器!
有效路径:/ 默认整站有效
有效域名:默认尽在当前域名下有效!
是否仅安全连接传输:默认为非 是否HTTPONLY:默认为非;
Session属性的来源?
COOKIE中存储session-ID的属性,决定了对应的session数据的属性。
Cookie名称PHPSESSID有它的属性

session相关函数

session_start: 初始 session。
session_destroy: 结束 session。
session_unset: 释放session内存。
session_name: 存取目前 session 名称。
session_module_name: 存取目前 session 模块。
session_save_path: 存取目前 session 路径。
session_id: 存取目前 session 代号。
session_register: 注册新的变量。
session_unregister: 删除已注册变量。
session_is_registered: 检查变量是否注册。
session_decode: Session 资料解码。
session_encode: Session 资料编码。

设置

如何设置 session数据的属性?
设置COOKIEsession-ID这个COOKIE变量属性即可!
设置方案如下:

方案一:配置变量php.ini:

session.cookie_lifetime=0 session.cookie_path=/ session.cookie_domain=
session.cookie_secure= session.cookie_httponly
可以更改以上配置,然后重启apache服务器

方案二,在脚本中,开启session之前使用函数进行配置

Ini_set(配置项,值);用于设置某个PHP配置选项
例:ini_set('session.cookie_lifetime','3600'); ini_set('session.cookie_domain','.kang.com');
也可以用:session_set_cookie_params(有效期,有效路径,有效域,是否仅安全连接传输,是否HTTPONLY)
例如:session_set_cookie_params(3600,'/','.kang.com');
建议使用该方法,仅仅影响当前脚本周期。不影响其他项目!
实际环境中,很少该session的有效期。经常改有效域名。
开启bool session_start(void).一个页面只能开启一次,不能重复开启,可以加@屏蔽错误
session_id() || session_start();
添加session数据比如$_SESSION[‘name’]=’admin’;
Session的名称可以是字符下标,也可以是整形下标,除了资源外都可以保存
$_SESSION['user'][]='admin'; $_SESSION['user'][]=’1.9’; $_SESSION[‘user’][]=false; $_SESSION['user'][]=array(1,2); $_SESSION[‘user’][]=new student;
除了资源外,都可以保存
在服务器中存储的位置,保存在c盘下C:\\WINDOWS\\TEMP,文件名格式:sess_sessID

方案三,设置session的载体cookie

session_start();

$_SESSION['name']='xjd';

// echo session_id();

// echo session_name();

$lifetime=60*2;    //2分钟
setcookie(session_name(),session_id(),time()+$lifetime,'/');

删除

删除session数据:使用unset()来删除单个session数据,比如unset($_SESSION[‘name’]).也可以将一个空数组,赋给$_SESSION变量,将SESSION文件内容情况,session文件成为垃圾

读取SESSION数据,读取或增删改查,都是使用$_SESSION全局数组.
比如echo $_SESSION[‘name’];

销毁SESSION文件,只删除自己的SESSION,不会删除别的用户的.语法:bool session_destroy().用destroy之后要再开启session,它才有文件.否则是在内存中,能页面输出,但是没文件. 同时关闭session机制!

获取当前的session-id值.语法:string session_id([string $id])

获取当前的session的cookie数据名称.语法:string session_name([string $name]),一般不修改ini

Session设置:修改php.ini文件,session保存位置:session.save_path=”c:/…”;

修改session名称session.name=PHPSESSID

session_set_cookie_param


使用函数修改session的cookie的相关参数,session_set_cookie_param
语法:void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
参数:
$lifetime,过期时间,以秒为单位,直接写秒。
$path 有效路径
$domain 有效域名
$secure 是否仅限https发送COOKIE。
$httponly 是否仅限http协议使用COOKIE
注意:该函数必须在SESSION_START()之前设置

Session垃圾回收

gc:garbage collection垃圾回收 maxlifetime:最大存活时间
修改php.ini文件 session.gc_maxlifetime=1440 垃圾默认时间1440秒
回收概率
session.gc_probability:概率,相当于分子。默认值为1。
session.gc_divisor:除数、因子。相当于分母。默认值为1000
默认的比率是:1/1000,每1000个用户访问时,会完整的进行一次清理。

重写session的存储机制,入库

先设置在开启session机制

Session_set_save_handler()先于session_start()被调用。
不要自动开启session!php.ini: session.auto_start = 0

PHP配置项:session.save_handler

PHP所使用的存储机制:php.ini中:session.save_handler=files默认文件机制
建议,将以上配置改为 user: 表示用户自定义!
也可以脚本配置:ini_set( ‘session.save_handler’,’user’ );

告知session机制,在需要读写时,使用用户自定义的读写函数完成

session_set_save_handler(开始函数,结束函数,读函数,写函数,删除函数,GC函数);
用来将用户自定义的函数,设置成session存储相关的函数。
session_set_save_handler('sessBegin', 'sessEnd', 'sessRead', 'sessWrite', 'sessDelete', 'sessGC');
Tip:以上的语法,仅仅是设置告知,在session机制运行到某个时间点时,才会被调用!

使用session

开启session机制 session_start();
操作$_SESSION $_SESSION[‘new_key’]=’new_value’;

创建session表

create table session (
         sess_id varchar(40) not null,
         sess_content text,
         last_write int not null default 0,
         primary key (sess_id)
) engine=myisam charset=utf8;
#全部代码如下
function sessBegin() 
         mysql_connect('127.0.0.1:3306', 'root', '520');
         mysql_query('set names utf8');
         mysql_query('use php2');

function sessEnd() return true;
function sessRead($sess_id) 
         $sql = "select sess_content from session where sess_id='$sess_id'";
         $result = mysql_query($sql);
         $row = mysql_fetch_assoc($result);
         if ($row) 
                   return $row['sess_content'];
          else 
                   return '';
         

function sessWrite($sess_id, $sess_content) 
    // replace into: 如果主键存在,则替换,否则插入。语法与insert into一致!
         $sql = "replace into session values ('$sess_id', '$sess_content', unix_timestamp())";
         return mysql_query($sql);

function sessDelete($sess_id) 
         $sql = "delete from session where sess_id='$sess_id'";
         return mysql_query($sql);

function sessGC($maxlifetime)                 
    $sql = "delete from session where last_write < unix_timestamp()-$maxlifetime";// 最后写入时间 < 当前时间-最大有效期
         return mysql_query($sql);

session_set_save_handler('sessBegin', 'sessEnd', 'sessRead', 'sessWrite', 'sessDelete', 'sessGC');
ini_set('session.save_handler', 'user');

浏览器禁用COOKIE,session是否可用?

COOKIE被禁用,session-Id不能存储和传输。不可用!
理论上的解决方案:
通过 URL, 或者 POST数据数据向服务器端,每次传输session-ID!
还要在浏览器中把接收cookie给关闭
例如下面的配置:php.ini
Session是否仅仅是用COOKIE完成传输session-ID:Php.ini中:session.use_only_cookies=1
是否通过其他方式自动传输session-ID. Php.ini中session.use_trans_sid=0
或者脚本设置: ini_set(‘session.use_only_cookies’,’0’); ini_set(‘session.use_trans_sid’,’1’);
测试:在浏览器中设置关闭接受来自站点的Cooki

ini_set('session.use_only_cookies', '0');   // 不仅仅是用COOKIE传输session-ID
ini_set('session.use_trans_sid', '1');   // 自动通过 url 或者  表单 传输 session_id
session_start();         // 常规使用session即可!
?>
<hr>
         <form action="session_no_cookie_2.php" method="post">  //文件地址就是自己
         <input type="submit">
         </form>
<hr>
         <a href="session_no_cookie_2.php"> no cookie</a>

session中存时间戳

if (!isset($_SESSION['CREATED'])) 
    $_SESSION['CREATED'] = time();
 else if (time() - $_SESSION['CREATED'] > 1800) 
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    //使用新生成的会话 ID 更新现有会话 ID
    $_SESSION['CREATED'] = time();  // update creation time
  1. 如果没有设置$_SESSION['CREATERD'],则通过time()函数赋值,此时$_SESSION['CREATERD']为当前时间戳(记住是当前时间戳啊)
  2. 如果设置了$_SESSION['CREATERD'],则将$_SESSION['CREATERD']的值与现在的时间戳time()进行对比,此时不管怎么样,肯定都是过了一段时间的,这个时候的time()的返回值一定和$_SESSION['CREATERD']不一样。因此判断差值,如果大于1800秒,就更新$_SESSION['CREATERD']的值。

每次读取这个session的时候,先对比下当前时间和session中保存的时间,如果相差的值已经超过过期的时间,那就说明这个session很久没有活动了,就可以当作过期处理;

如果没有过期,就把当前时间更新到session中,这个时间不要当成登录时间来看待,而是当成最后活跃时间。

对比过期与否,判断最后活动时间和当前时间,而不是登录时间,这样只要用户一直保持活跃,就可以保持在线状态。

如何设置30分钟严格过期的session

使用memcache, redis等, okey, 这种答案是一种正确答案. 不过, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?

  1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

  2. 自己为每一个Session值增加Time stamp.

  3. 每次访问之前, 判断时间戳.

最后, 有同学问, 为什么要设置30分钟的过期时间: 这个, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠劵?

总结

相关配置
session.save_handler 存储处理器: files|user
session.save_path 存储地址。
session.cookie_XXX (lifetime,path,domain,secure,httponly)存储session-ID这个COOKIE变量的属性

以上是关于cookie和session的主要内容,如果未能解决你的问题,请参考以下文章

简述cookies和session的区别

session和cookie的区别

session和cookie的区别是啥?

Session和Cookie

Token是啥?和session、cookie相比,使用场景有啥区别?

Cookie和Session