解析 PHP 中 session 的实现原理以及大网站应用应该注意的问题

news/2024/5/9 8:39:50/文章来源:https://blog.csdn.net/weixin_33739646/article/details/93336331

一 PHP SESSION原理

session 是在服务器端保持用户会话数据的一种方法,而 cookie 是在客户端保持用户数据。HTTP 协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系。那么,服务器是如何记住众多用户的会话数据呢?

首先要将客户端和服务器端建立一对一联系,每个客户端都得有一个唯一标识,这样服务器才能识别出来。建立唯一标识的方法有两种:cookie 或者通过 GET 方式指定。默认配置的 PHP 使用 session 的时候会建立一个名叫 "PHPSESSID" 的 cookie(可以通过 php.ini 修改 session.name 值指定),如果客户端禁用 cookie ,也可以指定通过 GET 方式把 session id 传到服务器(修改 php.ini 中 session.use_trans_sid 等参数)。

查看服务器端 /tmp 目录(在不修改 PHP 配置的情况下)会发现很多类似 sess_0fb45ob06s3ictc5qp98frvjl6 这样的文件,这个其实就是 session id "0fb45ob06s3ictc5qp98frvjl6" 对应的数据。真相就在这里,客户端将 session id 传递到服务器,服务器根据 session id 找到对应的文件,读取的时候对文件内容进行反序列化得到 session 的值,而保存的时候先序列化再写入。

事实就是这样,所以如果服务器不支持 session 或者你想自定义 session,通过 PHP 的 uniqid 生成永不重复的 session id,然后找个地方存储 session 的内容即可。

二 使用 SESSION 之前为什么必须先执行 session_start()?

了解 session 的原理之后,所谓的 session 其实就是客户端一个 session id 对应服务器端一个 session file。新建 session 之前执行 session_start() 是告诉服务器要接收一个cookie 以及准备好 session 文件,要不然 session 内容怎么存;读取 session 之前执行 session_start() 是告诉服务器,赶紧根据 session id 把 session 文件反序列化。

只有一个 session 函数可以在 session_start() 之前执行,session_name():读取或指定 session 名称(比如默认的就是 "PHPSESSID"),这个当然要在 session_start 之前执行。

三 SESSION影响系统性能

session 在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的定位将非常耗时,PHP支持 session 目录hash,可以通过修改 php.ini 中 session.save_path = “2;/path/to/session/dir”,那么 session 将存储在两级子目录中,每个目录有16个子目录[0~f],不过 PHP session 不支持创建目录,需要事先把那么些目录创建好。

还有一个问题就是小文件的效率问题,一般 session 数据都不会太大(1~2K),如果有大量这样1~2K 的文件在磁盘上,IO 效率肯定会很差。

其实还有很多中存储 session 的方式,可以通过 php -i|grep "Registered save handlers" 查看,比如 Registered save handlers => files user sqlite eaccelerator 可以通过文件、用户、sqlite、eaccelerator来存,如果服务器装了 memcached,还有 mmcache 的选项。当然还有很多,比如 MySQL、PostgreSQL 等等,都是不错的选择。

四 SESSION的同步

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

session 同步有很多种,如果你是存储在 memcached 或者 MySQL 中,那就很容易了,指定到同样的位置即可,如果是文件形式的,你可以用 NFS 统一存储。

还有一种方式是通过加密的 cookie 来实现,用户在A服务器上登录成功,在用户的浏览器上种上一个加密的 cookie,当用户访问B服务器时,检查有无 session,如果有当然没问题,如果没有,就去检验 cookie 是否有效,cookie 有效的话就在 B 服务器上重建 session。这种方法其实很有用,如果网站有很多个子频道,服务器也不在一个机房,session 没办法同步又想做统一登录那就太有用了。

当然还有一种方法就是在负载均衡那一层保持会话,把访问者绑定在某个服务器上,那么所有访问都在那个服务器上就不需要 session 同步了。

转载于:https://www.cnblogs.com/afee666/p/6888990.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_803098.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单快速的了解网站的安全情况

站长们最关心的问题,也是危害最大的,自己网站有没有被植入木马呢?如何最简单知道呢?下面给你们分享下最简单知道网站有没有被植入木马。 第一种方法: 在浏览器打开网址 http://webscan.360.cn/(如下图,正常…

MVC与单元测试实践之健身网站(二)-管理员模块

2019独角兽企业重金招聘Python工程师标准>>> 开始动手做这个项目时,发现无法做到完全的先设计、再编码,于是决定分模块进行,从管理员模块开始设计、编码,而且接口就已经改了好几次了。 管理员模块涉及的功能有登录和后…

Yahoo团队经验:网站性能优化的34条黄金法则

2019独角兽企业重金招聘Python工程师标准>>> 1、尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容。这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减少 HTTP请求的次数。这是提高网页速度的关键步…

网路游侠:关于几个免费在线挂马检测网站

有时候我们需要知道一个网站的安全性,那么您可以像游侠这样在网站底部挂金山和瑞星的云安全检测系统,如下图所示:需要知道扫描效果的话,看看这两个网址:金山瑞星不过不知道大家看到没,瑞星只说有没有木马&a…

我觉得网站的通用部分

这个图片是我用xmind编辑的。欢迎大家来纠正或添加! 再来说说我对网站开发的理解与碰到的问题。 网站的前端有几个部分我觉得很重要: 1.优雅的文字提示 2.合理的页面设计 3.适当的脚本特效 一进入这个网站,就让人有一种非常舒适的感觉。并且在…

二、大型网站架构模式

为什么80%的码农都做不了架构师?>>> 1.分层:应用层(视图层、业务逻辑层)、服务层(数据接口层、逻辑处理层)、数据层。使逻辑结构清晰,解耦和,便于开发维护。 2.分割&…

使用apacheBench对网站进行压力测试(ab压力测试)

ApacheBench 简称ab, 是 Apache 附带的一个小工具 , 专门用测试网站服务器的运行想能,特别是针对Apache网站服务器的效能分析。专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。 windows下在安装完apache…

SEO优化如何让提高收录量

相信在做SEO优化的网络人员来说,最高兴的时候就是看见自己辛苦打出来的文章被收录了。可是,收录量就有点。。。。今天,我就来教教大家怎么提高收录量,主要分四个方面。 1、收录网站的时间间隔网站的重点是网站页面收录之间的时间间…

如何将网站的php版本信息隐藏起来

当我们把网站上线之后,我们可以通过curl的如下命令显示指定网站的头信息,curl的安装方法参考:https://www.wj0511.com/site/detail.html?id105 curl -I https://www.wj0511.com 如: 这时候可以看到如下信息 X-Powered-By: PHP/7.0.21 这样我们可以看到我们可以…

百度商桥放在php网站哪里_教你如何做好百度竞价推广

如何做好百度推广?这是每个百度客户在加入百度推广后必然想到的一个问题,也是每个实施顾问所困惑的问题。究竟我们可以通过哪些方法达到客户的预期,使客户与百度长久稳定的合作呢?小编给大家分享一下下面是一些优化账户的方法,供大家参考:首…

mysql学习文档_「mysql学习」MySQL学习文档 - seo实验室

mysql学习基础知识1 创建表CREATE TABLE tablename (name1 CHAR(100),name2 NUMERIC,name3 INT);2 向表中按行插入数据INSERT INTO tablename(name1,name2,name3) VALUES(value1,value2,value3);插入多行INSERT INTO tablename(name1,name2,name3) VALUES(value1,value2,value3…

资源网站

文章目录shell教程》](https://www.runoob.com/linux/linux-system-boot.html)![在这里插入图片描述Arduino学习》电子书下载》 shell教程》 Arduino学习》 电子书下载》

php网站友链直显代码,友情链接代码有哪些 怎么写

友情链接版块在大多数网站的底部都会有这块信息展示,少部分博客会在右下角显示友情链接,通常用于与别人的合作或者互相连接,达到引流、引蜘蛛的目的。那么友情链接代码是怎样的呢?href"url",url对应的是网站…

网站常用小图标

转载于:https://blog.51cto.com/181796968/42304

浏览器显示“您与此网站之间建立的连接不安全”的解决方案

现在很多网站打开的时候发现浏览器地址栏多了一个小的信息提示,点开看,谷歌的Chrome浏览器会提示“您与此网站之间建立的连接不安全”,火狐的firefox浏览器会提示“您与此网站之间建立的连接不安全”。 这种一般是什么原因导致的呢&#xff1…

适用于编程开发自学的学习网站

今天为大家分享几个编程开发自学的学习网站 1.C语言网 该网站有很多C语言相关的教程、资源、博客和练手习题,同时也有很多题库和比赛,比较实用。 网址:https://www.dotcpp.com/ 2.cppreference cppreference是一个免费网站,上面…

免费电子书下载网站,不来白嫖一波

作为开发者,多多少少都会看些技术书籍,许多经典的技术书籍作者都是国外的,等到中文翻译版出来很多书籍可能已经不适用了,购买原版书籍,价格又太高,因此知道一些免费的图书下载网站是非常重要的,…

分享一波学习编程刷题网站

相信很多小伙伴在学习了基础知识后并不清楚自己到底掌握了多少知识,也不清楚自己的实力,那这时候就需要做题来检验自己了,这里我就给各位推荐3个刷题网站,供各位大佬参考,互相学习 1.牛客网 网址:https://…

Quick Tip : 为什么不能在子网站创建自定义权限级别?

在SharePoint 2010中,如果一个子网站是继承其父网站的权限,那么从网站设置中打开网站权限页面,你会看到: 点击Ribbon区域的“停止继承权限”,管理员就可以断掉当前网站与父网站的权限继承,自定义网站的权限…

华为ensp实验案列推荐,这是我发现实验案列最多的一个网站,不看就亏大了

话不多说,先上图 没错,就是程序员大本营,本人这几天一直在寻找大量华为ensp的实验案列进行训练,一直没有找到太多,也不全,终于在今天让我找到了,这里面从ensp的安装到各种实验都有,想…