💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
#### 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