Session专题-这是最容易理解的Session的用途及实现原理

[复制链接]
查看: 1497|回复: 31
发表于 2022-11-1 20:50:02 | 显示全部楼层 | 阅读模式
首先,Session是基于cookie的,由于cookie保存在客户端,数据不安全。而Session可以理解为是将cookie保存在服务器上。
Session的原理如下:
  1. 1、客户端第一次访问服务器时,服务器会给每一个客户端分配一个空间,并为每个空间分配唯一的编号。
  2. 2、服务器将这个编号通过响应头作为cookie值响应给客户端。
  3. 3、客户端再次访问时会自动在请求头中携带该cookie传给服务器。
复制代码


默认情况下服务器不自动分配session会话,需要手动开启。代码如下:
  1. session_start();//开启session会话
复制代码


设置与获取session的方法如下:
  1. $_SESSION['name']='zhangsan';//设置session
  2. $_SESSION['age']=18;//设置session
  3. echo $_SESSION['name']."<br>";//获取session
  4. echo $_SESSION['age']."<br>";//获取session
复制代码
执行以上代码,浏览器输出结果如下:
Session专题-这是最容易理解的Session的用途及实现原理

服务器获取session编号,代码如下:
  1. session_start();//开启session会话
  2. $_SESSION['name']='zhangsan';//设置session
  3. $_SESSION['age']=18;//设置session
  4. echo $_SESSION['name']."<br>";//获取session
  5. echo $_SESSION['age']."<br>";//获取session
  6. echo 'session会话编号'.session_id();
复制代码


执行结果如下:
Session专题-这是最容易理解的Session的用途及实现原理

注意:session_start();只能开启一次,如果require文件中有session_start();语句,请在require文件中这样写:@session_start();


PHP.ini中与session相关的配置:
1、session.save_handler = files //session文件类型
2、session.save_path="D:\wamp\PHPTutorial\tmp\tmp" //session文件保存位置,默认由操作系统分配
如果修改该地址为:Y:\Code Archives\session,那么就会在该文件夹下保存session文件,如下:
Session专题-这是最容易理解的Session的用途及实现原理 Session专题-这是最容易理解的Session的用途及实现原理
默认情况下,关闭浏览器后session信息立即失效,但服务器不会删除session会话文件,重新打开浏览器后服务器再次写出session文件,并分配编号。

3、session.auto_start = 0 //是否自动开启session会话,0为不开启 1为开启。一般情况下都是设置为0,通过php代码手动开启。
4、session.gc_maxlifetime = 1440 //session文件空间的生命周期,默认为1440秒=24分钟,超过该时间后session文件被释放。
5、session.name = PHPSESSID //session的字段名称
Session专题-这是最容易理解的Session的用途及实现原理
6、session.cookie_lifetime = 0 //session编号的过期时间 0表示关闭浏览器即失效,其它数字为秒数。
7、session.cookie_path = /  //session的有效范围,默认为整站有效
8、session.cookie_domain =  //模式在当前域名下有效

注意:当前页面执行完毕后会自动关闭session会话,其它页面在获取session前需再次打开session文件空间,否则无法获取数据。例如,从session.php文件跳转至session2.php文件,那么在session2.php中应该这样写:
  1. <?php
  2. session_start();//再次打开session文件空间
  3. echo $_SESSION['name']."<br>";//获取session
  4. echo $_SESSION['age']."<br>";//获取session
  5. ?>
复制代码
执行效果如下:
Session专题-这是最容易理解的Session的用途及实现原理

销毁会话:执行如下代码将删除session会话文件。
  1. session_destroy();
复制代码
执行效果如下:
Session专题-这是最容易理解的Session的用途及实现原理

session会话的缓存文件由PHP的垃圾回收机制自动清理,回收的判断依据是session文件空间的生命周期设置,即php.ini中的session.gc_maxlifetime = 1440。
但是,超过这个时间后,PHP并不会立即全部过期文件,而是由php.ini中的session.gc_probability = 1和session.gc_divisor = 1000决定,这两句代码的意思是:回收的概率为1000分之1,即:触发1000次回收机制,才删除一次。


由于session是基于cookie的,默认情况下,当客户端阻止cookie后,session便不能使用。可以在php.ini中设置如下两个配置。
  1. session.use_only_cookies = 0 //表示session不仅依赖cookie
  2. session.use_trans_sid = 1 //表示允许通过其它方式传递sessionID
复制代码
设置以后会在GET请求地址中自动将sessionID作为参数传送给服务器,点击链接跳转后服务器自动接收sessionID。如下:
Session专题-这是最容易理解的Session的用途及实现原理 Session专题-这是最容易理解的Session的用途及实现原理 Session专题-这是最容易理解的Session的用途及实现原理
设置以后会在form表单中自动加入一个隐藏的input标签,value值是sessionID,如下:
Session专题-这是最容易理解的Session的用途及实现原理
在发送post请求时,服务器自动接收该sessionID,与get同理。

当然,session的强大还远不止于此,我们还可以将session保存到数据库中。
首先,我们创建一张数据表,sql代码如下:
  1. 方式一:innodb引擎方式(速度慢,永久保存)
  2. drop table if exists session;
  3. create table session (
  4. session_id varchar(50) primary KEY comment '会话编号',
  5. session_value text comment '会话值',//如果使用text类型,引擎就不能使用memory,数据只能存储在磁盘中
  6. session_time int unsigned not null comment '会话产生时间'
  7. )engine=innodb charset=utf8 comment '会话表'
复制代码
  1. 方式二:memory引擎方式(速度快,重启数据库清空)
  2. drop table if exists session;
  3. create table session (
  4. session_id varchar(50) primary KEY comment '会话编号',
  5. session_value varchar(2000) comment '会话值',
  6. session_time int unsigned not null comment '会话产生时间'
  7. )engine=memory charset=utf8 comment '会话表'
复制代码


Session专题-这是最容易理解的Session的用途及实现原理
写入数据的PHP代码如下:

  1. <?php
  2. //打开会话
  3. function open() {
  4.         global $link;
  5.         $link=mysqli_connect('localhost','root','root','data');
  6.         mysqli_set_charset($link,'utf8');
  7.         return true;
  8. }
  9. //关闭会话
  10. function close() {
  11.         return true;
  12. }
  13. //读取会话
  14. function read($session_id) {
  15.         global $link;
  16.         $sql="select session_value from session where session_id='$session_id'";
  17.         $rs=mysqli_query($link,$sql);
  18.         $rows=mysqli_fetch_row($rs);
  19.         return (string)$rows[0];
  20. }
  21. //写入会话
  22. function write($session_id,$session_value) {
  23.         global $link;
  24.         $sql="insert into session values ('$session_id','$session_value',unix_timestamp()) on duplicate key update session_value='$session_value',session_time=unix_timestamp()";
  25.         return mysqli_query($link,$sql);
  26. }
  27. //销毁会话
  28. function destroy($session_id) {
  29.         global $link;
  30.         $sql="delete from session where session_id='$session_id'";
  31.         return mysqli_query($link,$sql);
  32. }
  33. //垃圾回收
  34. function gc($lifetime) {
  35.         global $link;
  36.         $expires=time()-$lifetime;        //过期时间点
  37.         $sql="delete from session where session_time<$expires";
  38.         return mysqli_query($link,$sql);
  39. }

  40. //更改会话存储
  41. session_set_save_handler('open','close','read','write','destroy','gc');
  42. //开启会话
  43. session_start();
  44. //session_destroy();
  45. $_SESSION['stu']=['tom','berry','hot'];
复制代码
注意:这一步有很多人出错,且极难找到问题。PHP会报如下错误,网上的解决方案几乎全部是胡扯,这是一个深坑。

错误信息:Warning: Failed to write session data (files).Please verify that the current setting of session.save_path is correct () in Unknown on line 0

PHP的该提示害人不浅,它说是保存位置的问题,其实写入数据时,主键冲突的问题。解决方法如下:

写入会话的sql语句应该这样写:意思是:如果sessionid已经存在则执行更新语句。
  1. $sql="insert into session values ('$session_id','$session_value',unix_timestamp()) on duplicate key update session_value='$session_value',session_time=unix_timestamp()";
复制代码

读取数据库中的session,代码如下:
  1. echo $_SESSION['name'];
  2. print_r($_SESSION['stu']);
复制代码
结果如下:
Session专题-这是最容易理解的Session的用途及实现原理

以上就是session的全部。
易博软件介绍

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-2-15 18:49:27 | 显示全部楼层
^曾经的我,也是有那么点爱编程,学得还可以吧,可是等到我毕业去面试的,没有一个公司愿意录我,那个伤心呀!,后来有程序员招聘也不敢去,所以现在离那个很遥远了!

0

主题

25

帖子

14

积分

营销入门

Rank: 2

积分
14
发表于 2023-2-17 09:11:28 | 显示全部楼层
我看了你写的这些真的对我影响很大,虽然我还是一个学生,还没有进入社会,但要相信天外有天,人外有人,永远不要认为自己已经学好了

0

主题

6

帖子

3

积分

营销入门

Rank: 2

积分
3
发表于 2023-2-19 21:35:41 | 显示全部楼层
真的值得大家向你学习,不过学海无涯,还得加油学习!

2

主题

160

帖子

84

积分

终身会员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
84

终身会员

发表于 2023-2-21 08:53:31 | 显示全部楼层
会写程序不难,但要成为大师就不仅仅是学编程就能达到的。

0

主题

15

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-2-22 08:01:54 | 显示全部楼层
我是文盲,所以我不懂。我是孜孜不倦的追求者,所以我成功。。。
发表于 2023-2-24 00:20:23 | 显示全部楼层
x想了许多

0

主题

10

帖子

5

积分

终身会员

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

积分
5
发表于 2023-2-25 07:31:38 | 显示全部楼层
真的很好拉。虽然我是个初学者但是 让我少走了不少弯路。谢谢大师。呵呵  天天好心情拉。呵呵
发表于 2023-2-27 16:52:38 | 显示全部楼层
太精辟了,谢谢
发表于 2023-3-1 19:59:35 | 显示全部楼层
我觉得人你的很好啊,我离这个目标还差很多,我相信我很更加努力的  
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表