zoukankan      html  css  js  c++  java
  • Session的原理,大型网站中Session方面应注意什么?

    一、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

     1 <?php
     2 session_start();
     3 $_SESSION['name'] = "xiaobudiu";
     4 echo $_SESSION['name'];
     5 echo "<hr>";
     6 var_dump($_COOKIE);
     7 echo "<hr>";
     8 $url = "<a href = 'b.php'>下一页</a>";
     9 echo $url;
    10 ?>

    b.php

    1 <?php
    2 session_start();
    3 echo $_SESSION['name'];
    4 echo "<hr>";
    5 var_dump($_COOKIE);
    6 die;
    7 ?>

    (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,如下:

    1 session.use_trans_sid = 1
    2 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)。

    注释:此文章是专门为面试的小童鞋准备的,面试些奇葩的公司就会出现这道题如下面这张面试试卷

    (声明:文章转载他处,若侵权,联系删除。)

  • 相关阅读:
    普通索引和唯一索引的选择
    深入理解MySQL索引(上)
    深入理解MySQL索引(下)
    Python3爬取小说并保存到文件
    MySQL45讲:一条update语句是怎样执行的
    IO软件层次结构与假脱机技术
    一条查询SQl是怎样执行的
    MySQL45讲笔记-事务隔离级别,为什么你改了数据我看不见
    了解一下IO控制器与控制方式
    3.6类别不平衡问题
  • 原文地址:https://www.cnblogs.com/zmdComeOn/p/10167874.html
Copyright © 2011-2022 走看看