#### session属性
有效期:默认关闭浏览器! 有效路径:/ 默认整站有效
有效域名:默认尽在当前域名下有效!
是否仅安全连接传输:默认为非 是否HTTPONLY:默认为非;
Session属性的来源?
COOKIE中存储session-ID的属性,决定了对应的session数据的属性。
Cookie名称PHPSESSID有它的属性
如何设置 session数据的属性?
设置COOKIE中session-ID这个COOKIE变量属性即可!
设置方案如下:
1. 方案一:配置变量php.ini:
session.cookie\_lifetime=0 session.cookie\_path=/ session.cookie\_domain=
session.cookie\_secure= session.cookie\_httponly
可以更改以上配置,然后重启apache服务器
1. 方案二,在脚本中,开启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数据:使用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
![Image](https://box.kancloud.cn/6978b38aa2b70d16d0175fc11e014f00_627x328.png)
使用函数修改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!
例如下面的配置: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
<?php
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>
扩展:mysql中是用concat(-,-)方法连接字符串的
#### 总结
相关配置
Session.save\_handler 存储处理器: files|user
Session.save\_path 存储地址。
Session.cookie\_XXX (lifetime,path,domain,secure,httponly)存储session-ID这个COOKIE变量的属性
Session.gc\_maxlifetime Session.gc\_probability Session.gc\_divisor
- PHP
- 页面跳转
- 数据类型和运算符
- 整形
- 浮点型
- 字符串型
- 布尔型
- 判断数据类型
- 传值
- 类型转换
- 常量
- 进制转换
- 运算符
- 各种结构
- 数组
- 分类
- 创建
- 多维数组
- 数组操作函数
- 数组指针
- 排序
- 数组交换需要注意的
- 函数
- 创建函数
- 参数传递
- 参数数量问题
- 返回值
- 可变函数
- 匿名函数
- 冒泡,选择,二分
- 变量的作用域
- 局部作用域中使用全局
- use
- 有关函数的系统函数
- 递归
- 递推(迭代)
- 面向对象
- 类和对象
- 值传递
- 引用传递
- 成员
- 构造和析构调用上级同类方法
- 重写
- 最终类
- 最终方法
- 设计模式
- 抽象类
- 抽象方法
- 抽象类和抽象方法的细节
- 重载
- 接口
- 类和接口的总结
- 自动加载
- 克隆
- 对象的遍历
- 内置标准类
- 其他类型转对象类型
- 类型约束
- 魔术方法
- static关键字
- 命名空间
- 子级空间
- 引入机制
- 公共空间
- 使用注意
- 错误处理
- 错误的触发
- 错误报告的显示
- 错误日志的记录问题
- 自定义错误处理器
- 异常抛出
- 文件锁
- 文件处理
- 序列化与反序列化
- 目录操作
- 文件操作
- 文件上传
- $_FILFS
- 多文件上传处理
- 绘图技术
- 创建画布资源
- 操作画布
- 导出
- 销毁资源
- 验证码
- 补充文件居中
- 在图像上写入一行TTF字体的文本
- 获得图像相关信息
- 水印
- 等比例缩放
- 常见错误
- HTTP协议
- URL的构成
- 请求
- 防盗链
- 响应
- 使用header()禁用缓存
- 下载文件的HTTP响应头
- 文件下载
- HTTPS
- 会话技术
- cookie
- session
- PHP操作MySQL函数
- 登录
- 一些函数
- 从结果集中取出一行数据
- 获取行数,列数,字段名
- 安全
- 缓存
- 补充
- MySQL
- 语法
- 备份和恢复
- 注释
- 语句行
- 字符集
- 校验级
- 存储引擎
- 数据库操作
- 创建数据库
- 删除数据库
- 显示数据库
- 修改数据库
- 数据类型
- 整数类型
- 小数类型
- 日期时间型
- 字符和文本型
- enum类型
- set类型
- 时间类型
- 表操作
- 创建
- 索引
- 约束
- 表选项列表
- 表的其他语句
- 视图语法
- 增删改查
- 插入数据(增)
- 删除数据(删)
- 修改数据(改)
- 查询(查)
- 用户和权限管理
- 用户管理
- 权限管理
- PDO
- 与PDO相关的几个类
- 连接数据库
- 使用
- PDO的错误处理
- PDO结果集对象
- pdo结果集对象的常用方法
- PDO预处理
- 常用属性
- mysql编程
- 事务
- 语句块
- mysql中的变量
- (存储)函数
- 存储过程procedure
- 触发器(trigger)
- mysql优化
- 存储引擎
- 字段类型
- 逆范式
- 索引
- Memcache
- 与redis区别
- 安装
- php开启扩展
- php操作memcache
- Key的命名
- 有效期
- 各种数据类型存储
- 删除
- 第三个参数压缩作用
- 其他相关操作方法
- 终端命令操作方式
- 获取memcache统计信息
- Git
- 创建一个git仓库
- 添加
- 修改文件
- 删除文件
- 克隆
- 个人网站
- Ajax
- 发起请求
- 接受响应
- 常用属性和方法
- get和post
- get
- post
- 同步和异步
- 什么时候使用同步请求?
- 分页
- xml的接收和处理
- JSON
- 无刷新表单提交和进度条
- JQuery操作ajax
- iframe
- 邮件
- 介绍
- 发送邮件
- 直投邮件
- 中转邮件发送
- phpmailer
- 正则表达
- 简单使用
- preg_match()
- 正则内容
- 定义字符集
- 特别字符集
- 组合字符集
- 限制字符
- 模式修正符
- 进行全局匹配