您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > php

PHP 多台服务器跨域如何让 session 共享使用

时间:2019-10-08 14:50:50  来源:  作者:

 

重点讲讲redis方式的 session 共享方式,此方式也是博主推荐方式。

网站业务规模和访问量的逐步发展,原本由单台服务器、单个域名的迷你网站架构已经无法满足发展需要。

此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服务器上;或通过负载均衡技术 (如:DNS 轮询、Radware、F5、LVS 等)让多个频道共享一组服务器。

OK,头脑中我们已经构思了这样的解决方案,不过进入深入开发后新的技术问题又随之而来:

我们把网站程序分布部署到多台服务器上,而且独立为几个二级域名,由于 Session 受实现原理的局限(php 中 Session 默认以文件的形 式保 存在本地服务器的硬盘),使得我们的网站用户不得不经常在几个频道间来回输入用户名、密码登入,导致用户体验大打折扣;另外,原本程序可以直接从用户 Session 变量中读取的资料(如:昵称、积分、登入时间等),因为无法跨服务器同步更新 Session 变量,迫使开发人员必须实时读写数据库,从而增 加了数据库的负担。

于是,解决网站跨服务器之间的 Session 共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举 4 种较为可行的方案进行对比探讨:

1、基于 redis 的 Session 共享

redis 是基于内存的一款数据库,近年来非常火爆,使用人越来越多,基于他的各种类型的操作处理,与 memcache 对比,redis 优势更大。

php 仅需简单配置 php.ini 增加 redis 库即可正常使用。save_handler 参数更改为 redis,在配置上 redis 地址即可。

2. 基于 NFS 的 Session 共享

NFS 是 Net FileSystem 的简称,最早由 Sun 公司为解决 Unix 网络主机间的目录共享而研发。

这个方案实现最为简单,无需做过多的二次开发,仅需将共享目录服务器 mount 到各频道服务器的本地 session 目录即可,缺点是 NFS 依托 于复 杂的安全机制和文件系统,因此并发效率不高,尤其对于 session 这类高并发读写的小文件, 会由于共享目录服务器的 io-wait 过高,最终拖累前端 WEB 应用程序的执行效率。

3. 基于数据库的 Session 共享

首选当然是大名鼎鼎的 MySQL 数据库,并且建议使用内存表 Heap,提高 session 操作的读写效率。这个方案的实用性比较强,相信大家普 遍在 使用,它的缺点在于 session 的并发读写能力取决于 Mysql 数据库的性能,同时需要自己实现 session 淘汰逻辑,以便定时从数据表中更新、删除 session 记录,当并发过高时容易出现表锁,虽然我们可以选择行级锁的表引擎,但不得不否认使用数据库存储 Session 还是有些杀鸡用牛刀的架势。

4. 基于 Cookie 的 Session 共享

这个方案我们可能比较陌生,但它在大型网站中还是比较普遍被使用。原理是将全站用户的 Session 信息加密、序列化后以 Cookie 的方式, 统一 种植在根域名下(如:.host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有 Cookie 内容的特性,从而实现 用户的 Cookie 化 Session 在多服务间的共享访问。

这个方案的优点无需额外的服务器资源;缺点是由于受 http 协议头信心长度的限制,仅能够存储小部分的用户信息,同时 Cookie 化的 Session 内容需要进行安全加解密(如:采用 DES、RSA 等进行明文加解密;再由 MD5、SHA-1 等算法进行防伪认证),另外它也会占用一定的带 宽资源,因为浏览器会在请求当前域名下任何资源时将本地 Cookie 附加在 http 头中传递到服务器。

5. 基于 Memcache 的 Session 共享

Memcache 由于是一款基于 Libevent 多路异步 I/O 技术的内存共享系统,简单的 Key + Value 数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前本人所经历的项目达到 2000/秒 平均查询,并且服务器 CPU 消耗依然不到 10%。

另外值得一提的是 Memcache 的内存 hash 表所特有的 Expires 数据过期淘汰机制,正好和 Session 的过期机制不谋而合,降低了 过期 Session 数据删除的代码复杂度,对比“基于数据库的存储方案”,仅这块逻辑就给数据表产生巨大的查询压力。

基于 redis 的存储是这几个方案中推荐选用的!

其它方案依然有其使用的场合,具体选用哪套需要开发人员的根据当前的服务器资源、网站并发压力等综合评估。



Tags:PHP session   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
重点讲讲redis方式的 session 共享方式,此方式也是博主推荐方式。网站业务规模和访问量的逐步发展,原本由单台服务器、单个域名的迷你网站架构已经无法满足发展需要。此时我...【详细内容】
2019-10-08  Tags: PHP  session  点击:(107)  评论:(0)  加入收藏
▌简易百科推荐
序言:前段时间织梦因为版权的问题在网上闹得沸沸扬扬,也提醒了众多开发者选择cms上应该谨慎使用,今天给大家展示一款自己搭建的内容管理系统,不用担心版权的问题,而且非常容易维...【详细内容】
2021-11-30  小程序软件开发    Tags:管理系统   点击:(34)  评论:(0)  加入收藏
准备安装包(PHP: Hypertext Preprocessor)下载安装包以及组件wget https://www.php.net/distributions/php-8.0.0.tar.bz2wget https://github.com/phpredis/phpredis/archive...【详细内容】
2021-11-09  mimic96    Tags:PHP   点击:(40)  评论:(0)  加入收藏
golang context 很好用,就使用php实现了github地址 : https://github.com/qq1060656096/php-go-context context使用闭坑指南1. 将一个Context参数作为第一个参数传递给传入和...【详细内容】
2021-11-05  1060656096    Tags:PHP   点击:(41)  评论:(0)  加入收藏
一段数组为例:$list = array:4 [ 0 => array:7 [ "id" => 56 "mer_id" => 7 "order_id" => "wx163265961408769974" "is_postage" => 0 "store_name" => "奇...【详细内容】
2021-09-29  七七小影视    Tags:PHP   点击:(65)  评论:(0)  加入收藏
利用JS的CryptoJS 3.x和PHP的openssl_encrypt,openssl_decrypt实现AES对称加密解密,由于需要两种语言对同一字符串的操作,而CryptoJS 的默认加密方式为“aes-256-cbc”,PHP端也...【详细内容】
2021-09-16  李老师tome    Tags:对称加密   点击:(79)  评论:(0)  加入收藏
1、checkdate()验证格利高里日期即:日期是否存在。checkdate(month,day,year);month必需。一个从 1 到 12 的数字,规定月。day必需。一个从 1 到 31 的数字,规定日。year必需。...【详细内容】
2021-08-31  七七小影视    Tags:时间函数   点击:(80)  评论:(0)  加入收藏
对于各类开发语言来说,整数都有一个最大的位数,如果超过位数就无法显示或者操作了。其实,这也是一种精度越界之后产生的精度丢失问题。在我们的 PHP 代码中,最大的整数非常大,我...【详细内容】
2021-08-26  硬核项目经理    Tags:PHP   点击:(83)  评论:(0)  加入收藏
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门。今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总。上文说过,物理结构是用于确定数据以何种方式存...【详细内容】
2021-07-19  硬核项目经理    Tags:线性表   点击:(94)  评论:(0)  加入收藏
一、开启IIS全部功能。二、部署PHP1.官网下载并解压PHP: https://windows.php.net/downloads/releases/2.将php.ini-development文件改为php.ini3.修改php.ini(1)去掉注释,并修...【详细内容】
2021-07-15  炘蓝火诗  今日头条  Tags:PHP环境   点击:(129)  评论:(0)  加入收藏
一、环境说明本文中使用本地VM虚机部署测试。OS:CentOS Linux release 7.8.2003 (Core)虚机配置:2核CPU、4G内存①系统为CentOS 7.8 x64最小化安装,部署前已完成系统初始化、...【详细内容】
2021-06-25  IT运维笔记  今日头条  Tags:PHP8.0.7   点击:(141)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条