一、Session和Cookie的区别

Session是在服务器端保持会话数据的一种方法(通常用于pc端网站保持登录状态,手机端通常会使用token方式实现),存储在服务端。

Cookie是在客户端保持用户数据,存储位置是客户端(浏览器或者手机端)。

二、原理

1、当代码session_start(); 运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session_id。

2、定义的Session变量以一定形式存储在刚才产生的session文件中。客户端将session_id传递给服务端,服务端根据session_id找到对应的文件,读取的时候,对文件内容进行反序列化就能得到session的值,保存的时候先序列化再写入。由此通过session_id可以取出之前定义的变量。

3、也就是说,Session_id是取得存储在服务器端Session变量的身份证。

注:PHP中的Session在默认的情况下,是使用客户端的Cookie来保存session_id的(session_start();之后,会自动将session_id存储在cookie中),但是必须注意,Session不一定必须依赖Cookie,这也就是Session相比于Cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session_id附着在URL中,这样再通过session_id就能实现跨页使用session变量了。但是这种附着也是有一定条件的,即php.ini文件中的“session.use_trans_sid=1”或者编译时打开了--enable-trans-sid选项。

三、实验cookie禁用后,session的传递

1、cookie未禁用时的结果

(1)php文件

c.php

<?php
session_start();
$_SESSION['name'] = "xiaobudiu";
echo $_SESSION['name'];
echo "<hr>";
var_dump($_COOKIE);
echo "<hr>";
$url = "<a href = 'b.php'>下一页</a>";
echo $url;
?>

b.php

<?php
session_start();
echo $_SESSION['name'];
echo "<hr>";
var_dump($_COOKIE);
die;
?>

(2)此时,运行c.php代码在浏览器会得到类似下面结果:

(3)此时点击“下一页”,跳转到b.php

2、禁用掉cookie之后,重新运行代码

注:禁用cookie位置:chrome://settings/content

得到的结果:

也就是说,在不更改php.ini配置文件的前提下,禁用掉cookie之后,默认session是无法跨页传输的

3、解决禁用掉cookie之后,让session仍然可以正常传输

(1)关闭php.ini配置文件中 session.use_only_cookies,打开php.ini配置文件中session.use_trans_sid,如下:

session.use_trans_sid = 1
session.use_only_cookies = 0

(2)重新运次c.php

点击下一页进入b.php

可以看到,在浏览器禁用cookie之后,session仍然是可以继续传输的,只不过需要进行配置而已。

但事实上,并不太建议,也不需要这么做。毕竟是存在安全风险的。而且目前浏览器基本也不会主动禁用cookie。

四、Session在大型网站应用中需要注意的问题

1、如何解决Session文件过多,消耗IO性能

建议:可以更改php.ini的 session.save_handler 参数为redis或memcache等内存缓存数据库。

2、解决Session的同步问题

我们前端可能有很多台服务器,用户在A服务器上登录了,种下了session信息,然后访问网站的某些页面没准跳到B服务器上去了,如果这个时候B服务器上没有session信息又没有做特殊处理,可能就会出问题了。

解决方案:

(1)更改php.ini的 session.save_handler 参数为redis或memcache等内存缓存数据库

(2)还有一种方式是通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无 session,如果有当然没问题,如果没有,就去检验cookie是否有效,cookie有效的话就在B服务器上重建session。这种方法其实很有 用,如果网站有很多个子频道,服务器也不在一个机房,session没办法同步又想做统一登录那就太有用了。
(3)当然还有一种方法就是在负载均衡那一层保持会话,把访问者绑定在某个服务器上,他的所有访问都在那个服务器上就不需要session同步了(比如负载均衡中的ip_hash)。

Session的原理,大型网站中Session方面应注意什么?相关推荐

  1. php session和cookie区别,php中session和cookie的区别是什么?

    一.Session (1)Session的由来以及介绍 Session:在计算机中,尤其是在网络应用中,称为"会话控制",生存时间为用户在浏览某个网站时,从进入网站到关闭这个网站所 ...

  2. Memcached在大型网站中应用

    memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.最初为了加速 LiveJ ...

  3. Memcached在大型网站中应用[php 转载]

    memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.最初为了加速 LiveJ ...

  4. 大型网站中的验证码解决方案

    先看这个demo的解决方案图 Entity是实体,里面有验证码的实体 private string contentType = "image/pjpeg";private Imag ...

  5. java中session的用法与原理

    https://www.cnblogs.com/xdp-gacl/p/3855702.html session简介 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注 ...

  6. 大型网站技术架构核心原理剖析,文末附知识图谱下载

    什么是软件架构 维基百科定义:软件架构是指有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计. 软件架构5大要素: 性能 可用性 伸缩性 扩展性 安全性 可以通过考察这5大要素来衡量 ...

  7. 限制会话id服务端不共享_分布式系统中Session共享的常用方案

    分布式Session一致性? 说白了就是服务器集群Session共享的问题 Session的作用? Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息. 客户端 ...

  8. Cookie和Session的作用,区别和各自的应用范围,Session工作原理

    Cookie和Session的作用与区别 Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请 ...

  9. 说说大型网站可伸缩性架构的设计原理

    可伸缩性架构指的是:不改变网站的软硬件设计,只通过改变部署的服务器数量就可以扩大或缩小网站的服务处理能力. 大型网站中的 "大型",可以表现在以下几个方面: * 用户方面 - 大量 ...

最新文章

  1. 无所不在的物联网设备 你我都需要正视所带来的安全问题
  2. Android性能优化典范第二季
  3. Python3 如何优雅地使用正则表达式(详解五)
  4. OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
  5. 提高ipad浏览器下大尺寸xml文件解析的性能
  6. 用函数式编程,从0开发3D引擎和编辑器(三):初步需求分析
  7. 基线管理之Centos安全配置
  8. 阿里Goldeneye业务监控平台之架构演进,如何实时处理100T+/天的日志量?
  9. TypeId和IidManager关系
  10. Groovy(一)安装和基础环境配置
  11. 【IoT】NFC APDU 使用基础浅析
  12. 药品名自动归类机器人(化药_中成药_中药材)
  13. python里apply用法_Python中apply用法学习【转载】
  14. 一些无添加剂的日常食用品、洗护用品的价格(感谢飞哥)
  15. 掌上飞车-艳云脚本云控系统
  16. aardio - 制作启动等待动画窗口
  17. 自定义桌面launcher-android
  18. 滴滴:WebApp实践经验总结
  19. ARM - Linux嵌入式C/C++各种资料分享【更新日期:2012/04/24】
  20. 测距必备,8个超声波测距方案,实时更可控

热门文章

  1. 许可证( License LicenseLicenseLicenseLicenseLicense)服务器配置
  2. Linux5配置jboss环境
  3. ISA禁止了symantec的LiveUpdate的使用
  4. DispatcherCore ,一个WPF异步操作常用功能库
  5. 在 Ubuntu 上安装 .NET SDK 或 .NET 运行时
  6. 鸡肋还是革新——Blazor进WinForm
  7. 如何在 .NET 程序万种死法中有效的生成 Dump (上)
  8. .NET 5 程序高级调试-WinDbg
  9. WinUI 3 Preview 3 发布了,再一次试试它的性能
  10. 甲骨文是否可以要求 Java API 享有版权?这场10年官司怎么结