PHP实现多服务器SESSION共享
为什么要session共享?
现在稍微大一点的网站基本上都有好几个子域名,比如www.feiniu.com, search.feiniu.com, member.feiniu.com,
这些网站如果需要共用用户登录信息,那么就需要做到session共享,当然前提是有相同的主域名。
PHP的session原理?
客户端访问php页面,执行session_start,生成session_id,一般我们是把session_id存储到cookie上,session内容保存在服务端,
客户端访问访问不同的页面都会把session_id传到服务端,通过session_id来获取session内容。
流程是这样,可是不同的服务器会对同一个客户端产生不同的session_id,这样的话不同服务器就不能得到相同的session内容。
而且PHP 默认的 SESSION 数据都是分别保存在本服务器的文件系统中。
所以我们要解决session共享,就必须解决两个问题:
1. 多台服务器用同一个session_id
这个比较容易解决,只要在php中设置存session_id的cookie域名为网站主域就可以
打开PHP.ini, 设置session.cookie_domain = .feiniu.com,
当然也可以在php代码当中设置ini_set("session.cookie_domain","feiniu.com");
2. 多台服务器用同一个session_id访问到相同的session内容
要实现这点,就必须把session内容存储到让所有服务器都能访问到的地方,php的session内容是默认存储到本服务器的文件中的,
一般的解决方案是存入数据库,memcache或者redis这种缓存服务器,当然用默认的文件存储方式也可以,用NFS统一存储。 如何修改session存储引擎,参考这篇文章:http://blog.csdn.net/yagas/article/details/7593415
如何选择存储引擎?
默认文件存储:
这种方式的session销毁依托于php垃圾收集器,在高并发或销毁时间较长的情况下,在SESSION目录下产生大量文件,当然可以设置分级目录进行 SESSION 文件的保存。
这会导致两个问题:第一、查找文件慢;第二,每个目录下可容纳的文件数是有限的,可能会导致新SESSION储存失败。
数据库存储:
把Session存储在数据库里可以防止Session数据被垃圾收集器删除,可以固化存储session数据。
但是用数据库来同步session,会加大数据库的IO,增加数据库的负担。而且数据库读写速度较慢,不利于session的适时同步。
memcache存储:
1.以这种方式来同步session,不会加大数据库的负担,并且安全性比较高,把session放到内存里面,比从文件中读取要快很多。 2.但是memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。 3.那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源。
redis存储:与memcache相比,redis访问稍稍慢一点点,好处是:
1.redis支持的数据结构较多,可以存储数组或对象,而memcache只能存储字符串。 2.在session机器重启的情况下,memcache所有用户都必须重新获得 session,而redis不会。 3.在突然涌来大量用户产生了很多数据把存储 session 的机器内存占满了的情况下,memcache会罢工,所有key都没过期的话就不停的覆盖最后写入的数据,而redis只是会变慢,不会影响程序的逻辑。
原文地址: https://blog.csdn.net/xue632777974/article/details/68060837?utm_source=copy
PHP实现多服务器SESSION共享的更多相关文章
- PHP实现跨服务器session共享的方法教程
今天带来PHP实现跨服务器session共享的方法教程. 本文实例讲述了PHP实现cookie跨域session共享的方法.分享给大家供大家参考,具体如下: 做过web开发的小伙伴们都了解cookie ...
- PHP + Memcache 实现多服务器session共享
很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了.这时我们可以考虑使用memcache 来接 ...
- 负载均衡服务器session共享的解决方案
在ASP.NET的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了S ...
- session以及分布式服务器session共享
一.session的本质 http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你. 那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录 ...
- 负载均衡服务器session共享的解决方案 (转载)
http://luanzhz.blog.163.com/blog/static/58023129201101811445262/ 在ASP.NET的程序中要使用Session对象时,必须确保页面的@p ...
- SqlServer Session共享注意点
公司下派任务,之前的网站是一台服务器,由于用户过多,负载过大,现在老大要求多加一台服务器.加就加贝,应该跟我这DEV没有 关系吧,应该不会碰到Source的吧.但是,之前网站有一些数据是放在Sessi ...
- 分布式架构下,session共享有什么方案么?
分布式架构下,session共享有什么方案么? 会点代码的大叔 科技领域创作者 分布式架构下的session共享,也可以称作分布式session一致性:关于这个问题,和大家说一说解决方案(如果有其他的 ...
- 一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.分布式架构下,Session共享有什么方案 2.简述你对RPC.RMI的理解 3.分布式id生成方案 4.分布式锁解决 ...
- 多Web服务器之间共享Session的解决方案
一.提出问题: 为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务 ...
随机推荐
- Java判断一个类里是否存在某个属性
Java判断一个类里是否存在某个属性 测试pojo类,比方我有个User类 @Getter @Setter public class User { private Long id; private S ...
- javascript实现深浅拷贝
深浅拷贝通常是对于引用数据类型进行的(数据类型为:对象(Object).数组(Array).函数(Function)) 浅拷贝: let obj = {id: 1, name: 2}; let new ...
- VSphere服务器ESXI4.1.0设置虚拟主机来电开机自启动
vSphere服务器ESXI设置虚拟主机来电自启动 首先查看我自己VMware vSphere版本为4.1.0(需要在虚拟主机电源为关闭状态下编辑) 然后双击主机,点击配置---虚拟机启动/关机 点击 ...
- El 表达式和 Jstl 标签库
El 表达式学习 1. 什么是 EL 表达式 全称:Expression Language,一种写法非常简介的表达式.语法简单易懂,便于使用.表达式语言的灵感来自于 ECMAScript 和XPath ...
- Redis: 分布式锁的正确实现方式(转)
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- HTML水平居中和垂直居中的实现方式
父元素是块元素,根据子元素不同分为以下几种: 1.子元素是行内元素: a.水平居中:在父元素上设置text-align:center; b.垂直居中:在行内子元素上设置行高与父元素相同line-hei ...
- JDK_1.8的Windows和Linux环境下的下载与安装
下载: Eclipse需要Jdk,MyEclipse有自带的Jdk 直接点击下载. Windows下JDK安装: 双击运行程序 下一步: 路径 更改到E:\Software\Java\jre1.8.0 ...
- GB28181 To RTMP/HLS/HTTP-FLV/DASH Gateway
I. Deployment / Architecture Block Diagram II. Resources Used 1. freeswitch —— sip server https://f ...
- ubuntu18.04 设置环境变量
1.第一步:命令行输入 sudo gedit /etc/profile 2.第二步:将你想要设置环境变量的内容追加到文件结尾 例如:export JAVA_HOME=/usr/java/latest ...
- C# 给DataTable去重
using System; using System.Data; namespace DelegateTest { public class Program { public static void ...