Heim >php教程 >php手册 >php中Session工作原理与用法详解

php中Session工作原理与用法详解

WBOY
WBOYOriginal
2016-06-13 09:52:071125Durchsuche

有很我朋友会问Session是如何工作的它与cookies有会有什么区别呢,下面我们一给各位同学介绍一下关于Session工作原理,有需要了解的朋友可进入参考。


1.什么是Session

2.Session从用户访问页面开始,到断开与网站连接为止,形成一个会话的生命周期。在会话期间,分配客户唯一的一个SessionID,用来标识当前用户,与其他用户进行区分。
3.Session会话时,SessionID会分别保存在客户端和服务器端两个位置,对于客户端使用临时的Cookie保存(Cookie名称为PHPSESSID)或者通过URL字符串传递,服务器端也以文本文件形式保存在指定的Session目录中。
4.Session通过ID接受每一个访问请求,从而识别当前用户、跟踪和保持用户具体资料,以及Session变量(在Session活动期间,可在Session中存储数字或文字资料),比如session_name等等,这些变量信息保存在服务器端。
5.SessionID可以作为会话信息保存到数据库中,进行Session持久化,这样可以跟踪每个用户的登陆次数、在线与否、在线时间等。
session.name=PHPSESSID;用在cookie里的session的名字

•session.save_handler=files;用于保存/取回数据的控制方式
•session.save_path=/tmp;在save_handler设为文件时传给控制器的参数,这是数据文件将保存的路径.
•session.use_cookies=1;是否使用cookies

在php中如何操作session:

session_start();   //使用该函数打开session功能

$_SESSION       //使用预定义全局变量操作数据

使用unset($_SESSION['key']) //销毁一个session的值

简单地操作,一切都是由服务器实现;由于处理在后台,一切看起来也很安全。但是session采用什么样机制,又是怎样被实现,并且如何来保持会话的状态的呢?


这里顺便说明一下,如果要做服务器的lvs,即多台server的话,我们一般使用memcached的方式session,否则会导致一些请求找不到session。
一个简单的memcache配置:

 代码如下 复制代码
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"

当然如果一定要使用files文件缓存,我们可以将文件作nfs,将所有的保存session文件定位到一个地方。

刚才讲返回给用户的session-id最终保存在内存中,这里我们也可以设置参数将其保存在用户的url中。

 

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

了解的原理之后,所谓的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效率肯定会很差,PHP手册上建议使用Reiserfs文件系统,不过Reiserfs的前景堪忧,Reiserfs的作者把媳妇给杀了,SuSE也抛弃了Reiserfs。

其实还有很多中存储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没办法同步又想做统一登录那就太有用了

实例问题
现有系统A,B; 假设A系统是可以独立运行的web系统,即可以和浏览器直接处理session, B系统是基于mobile的,需要调用A系统的功能接口,
在保持A不改变的情况下,即登陆验证,session存储都不变的情况下,B系统能处理前端用户的请求。

这里提供的方案是使用PHP实现

在用户登陆成功后,将保存的session的session-id返回给B系统,然后B系统每次请求其他接口都带session_id。
A系统在session_start前加上session_id(session_id);

这样B系统就能安全的调用A

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn