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
数据的属性?
设置COOKIE
中session-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
}
- 如果没有设置
$_SESSION['CREATERD']
,则通过time()函数赋值,此时$_SESSION['CREATERD']
为当前时间戳(记住是当前时间戳啊) - 如果设置了
$_SESSION['CREATERD']
,则将$_SESSION['CREATERD']
的值与现在的时间戳time()进行对比,此时不管怎么样,肯定都是过了一段时间的,这个时候的time()的返回值一定和$_SESSION['CREATERD']
不一样。因此判断差值,如果大于1800秒,就更新$_SESSION['CREATERD']
的值。
每次读取这个session的时候,先对比下当前时间和session中保存的时间,如果相差的值已经超过过期的时间,那就说明这个session很久没有活动了,就可以当作过期处理;
如果没有过期,就把当前时间更新到session中,这个时间不要当成登录时间来看待,而是当成最后活跃时间。
对比过期与否,判断最后活动时间和当前时间,而不是登录时间,这样只要用户一直保持活跃,就可以保持在线状态。
如何设置30分钟严格过期的session
使用memcache, redis等, okey, 这种答案是一种正确答案. 不过, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?
设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.
自己为每一个Session值增加Time stamp.
每次访问之前, 判断时间戳.
最后, 有同学问, 为什么要设置30分钟的过期时间: 这个, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠劵?
总结
相关配置
session.save_handler
存储处理器: files|user
session.save_path
存储地址。
session.cookie_XXX (lifetime,path,domain,secure,httponly)
存储session-ID
这个COOKIE变量的属性