session “怪异”问题

关于这个“怪异”还是加了个双引号的,因为他只是表象看起来如此,但在查清楚后,就会有种莫名的想抽自己脑门的冲动,先说一个这个引的session 问题的背景,一台旧服务器因为硬件升级不再做主服务器来用户了,也就将它转为测试用了,原来的环境为全通过yum 安装的php + apache 至于配置什么的全是默认的,因为现在主服务器上的环境为nginx + php-fpm 为了更好的测试,以求测试服务器(旧服务器)也需一样的环境,因此也来了一通yum安装,一番设置过后,网站是毫无疑问的运行了,但就在登录时,一直报图形验证码错误,一开始,还以为是自己眼花呢,但几次下来确定不是自身的问题,就开始了如下的探索问题的过程

  1.确定是session 引起的问题

  2.怀疑是session 名称(php.ini 中的session.name)引起的,但细想这是不可能的,这只是个名称而且,并不影响。

  3.怀疑是cookie 域或是session 域的问题,(因domain 一栏为空),在加了域后发现问题依旧。

  4.通过跟踪session 发现能在存储session 时成功保存,但在下个请求时无法取到相应的session值。

至此“怪异”就出现了,按常理来说,成功存取后,就能保存的服务中,但取时却为空,是不是很奇怪,亦或是各位看官已经有了答案了,如果没有,请看下面的道破其所以然

1.在php中生成session后会在保存session 时将数据写入以session id 名称生成对应的文件保存在对应的文件中,这个对应的文件路径则由php.ini 文件下的 session.save_path 决定

2.至于为什么在设置session请求中能看到要保存的session 数据 ,这只是一个表象,简言之就是为$__SESSION 这个全局变量赋值了,但没有保存至 save_path下面,以至无法在获取请求中获取到,

那可能要问了为什么不能保存呢?关于这个问题,是因为权限,因为这save_path 的权限为600 只对拥有者有读写权限,因此要看你的php-fpm 是由谁执行的,并与save_path 的目录权限进行对比,这就是问题的所在。

总结:

  1.在一些老的配置环境下,对于save_path的拥有者大部分为apache ,但在改用nginx+php-fpm时会为启动线程指定执行者,如果没有注意到这一点,修改执行者为非apache 那就会出现上述的session “怪异”问题

  2.对于原来生成的session 文件建议是修改为php-fpm 执行者所有,或者是清空目录文件,如果不这么做的话,有可能还是会出现如上所述的问题,因为session id 相同生成的文件相同,至使还是没有相应的权限修改或添加。

  3.这是一个隐藏的比较深的问题,但是又是一个最基础的问题。

  

时间: 2024-08-29 22:04:55

session “怪异”问题的相关文章

php的session获取不到问题之ie浏览器(yaf框架)

最近在内网写代码的时候遇到一个很怪异的问题, 花了好长时间调试,在次记录一下问题和解决方法. 问题描述: 内网开发使用的yaf框架,在火狐,谷歌,创建的session和cookie都能获取的到,但是在ie浏览器就是获取不到 尝试了各种php.ini的配置,编码,cookie禁用开启,配置域名,等都是不行,只要一到ie下就出问题,也在 网上查询了很多资料,甚至到了FQ到国外去都不行,也求教了一些高手,还是不行,最后经过自己不断调试终于 知道问题之所在了. 解决方法:通过大量调试, 发现问题是非法的

COOKIE+SESSION

cookie的缺点: 因为cookie保存在浏览器上,所以安全性低可控性比较差,只能存放字符串大多数的浏览器对cookie有4K的限制. 下面是cookie在浏览器和服务器中请求与响应的过程: 1.    COOKIE的工作原理 cookie过程描述 网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) 用户第一次访问你的网站->在服务器端会将用户的信息设置为cookie(可以理解为制造饼干过程)->通过http协议发送给用户(浏览器),在用户端,coo

Nginx做负载均衡时session共享问题详解

用nginx做负载均衡时,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 再者Nginx连接Memcached集群时,Nignx的请求从memcached服务器中根据key获得了value则直接返回value,如果没有获得到value则去MySQL中查询再返回. location / { set $memcached_key "$request_uri"; #设置请求memcached服务器的key memca

会话技术Session&Cookie

一.会话技术简介 1.存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪     里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话技术是帮助服务器   记住客户端状态(区分客户端) 举例购物过程: 2.会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Cookie和Sessio

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存

JavaWeb基础—会话管理之Session

一.什么是session session类似于客户端在服务器端的账户.使用Map存放 一个会话锁定一个用户(一般情况下是一个客户端,即一个浏览器独占一个session对象),即使使用浏览器访问其他程序资源,也可以共享这个session (如何确定是同一个用户?创建session时把sessionID以cookie的形式传给客户端,客户端访问时再把此sessionID传过去进行校验 JSESSIONID ) 二.session和cookie的区别 cookie 把用户的数据保存到浏览器端,sess

session和cookie的区别

原作者:施杨(施杨's Think out)出处:http://shiyangxt.cnblogs.com 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie 里的内容来判断使用者,送出特定的网页内容给你. Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cook

Redis主从复制实现session共享

一.Redis安装 1. 下载安装扩展源及源码包 yum install -y epel-release jemalloc-devel wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21 tar -zxvf 2.8.21 make:make PREFIX=/usr/local/redis install mkdir -p /usr/local/redis/etc 解决办法: cd deps/ make hiredis lua

cookie和session得区别

1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据. 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间. Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了. 注:为这个用户创建的Cookie的名称是aspsessionid.这个Cookie的唯一目的就是为每一个用