昆明利于优化的网站,公司网站制作企业,邯郸公司起名,名片模板一、Session和Cookie的区别
Session是在服务器端保持会话数据的一种方法#xff08;通常用于pc端网站保持登录状态#xff0c;手机端通常会使用token方式实现#xff09;#xff0c;存储在服务端。
Cookie是在客户端保持用户数据#xff0c;存储位置是客户端#xff08…一、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_sid1”或者编译时打开了--enable-trans-sid选项。 三、实验cookie禁用后session的传递
1、cookie未禁用时的结果
1php文件
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。