浅析 PHP 中 session 的落到实处原理以及大网站应用应该专注的问题

一 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
的值,而保留的时候先种类化再写入。

图片 1

真实情况就是那般,所以只要服务器不扶助 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 同步了。

网站地图xml地图