Session在同一台服务器上跨二域名读取问题

问题描述:

按照用户功能划分将不同业务类型的程序文件(.php)放在web目录下的不同文件夹下,然后通过二级域名解析指定到对应的文件夹下。

类似于将

http://www.xxx.com/member/member.php

解析后为http://member.sesebest.com/member.php

在解析后原有程序的session变量无法在不同的二级域名间获得session_id

PHP SESSION 的工作原理

先来了解一下 PHP SESSION 的工作原理。

web开发中通常需要用使用Session对象存储特定用户会话所需的信息。

在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ID(此 ID 可通过函数 session_id() 获取/设置)。

SESSION ID 可以通过两种方式保留在客户端,使得请求不同的页面时,PHP 程序可以取得客户端的 SESSION ID

这个过程可以通过2中方法实现:

1.通过 COOKIE,将 SESSION ID 保存在 COOKIE 中,默认情况下,这个 COOKIE 的名字为 PHPSESSID

2.将 SESSION ID 自动加入到 GET URL 中,或者 POST 的表单中,默认情况下,变量名为 PHPSESSID

由于加入到URL中的方式很少使用,这里我们主要以 COOKIE 方式进行说明,这样是标准的获取SESSION ID的模式。

下面介绍下SESSION的数据保存过程,SESSION是在服务器端运行的系统变量它保存在文件或数据库中(一个误区是认为SESSION保存在服务器内存中)

默认情况下在php.ini中设置的SESSION保存方式是filessession.save_handler = files)即使用读写文件的方式保存 SESSION 数据,而SESSION文件保存的目录由session.save_path 指定,文件名以 sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。(当然如果访问量大,可能产生的SESSION文件会比较多,会影响系统效率,一个思路解决是这可以设置分级目录进行 SESSION 文件的保存,具体的内容不再本文保存范围之内)。

当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,

不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应的 SESSION 变量。

下面介绍PHP中的SESSION在遇到跨二级域名时无法正确读取的解决办法。

首先打开php.ini文件找到下面的选项,将参数设置为根域名,默认为空,设置后在phpinfo()函数中读取结果如下:

session.cookie_domain

.sesebest.com

.sesebest.com

然后重启webserver,这时SESSION就可以在不同的二级域名之间正确获取了。

注意:在Nginx环境中,除了重启webserver还需要重启PHP的进程,命令如下:

/usr/local/php/sbin/php-fpm restart

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值