和session有关的一个问题,不晓得算不算bug

#1 oday

       学习用speedphp做东西大概一个星期时间吧。最近折腾到用户登录那一块的时候突然就出问题了。我打开了强权控制。然后应为我想要实现一个用户多角色的省份验证(就是一个用户可以同时拥有,管理员,会员,或某些自定义成员组中一个或多个的身份,只要其中一个满足访问条件,即可放行),于是在apacl类下的验证函数,以及自动设置身份的那两个函数稍微做了点调整。将用户的多个身份构造成数组放入权限验证的session中。然后查询多个身份中是否有一个满足权限验证放行条件。有则准入。
    在做完修改后问题出现了。我使用ajax进行验证提交,提交完以json的形式返回结果,若未通过则以无刷新的通过js显示错误提示。js通过返回的数据判断是否成功,成功则通过js跳转至登陆成功页面。
    结果测试的时候发现验证成功的提示出现了。js也成功跳转了,但跳转后总是转到错误页面。
    然后我猜是不是session没有成功写入?于是我加了点测试用的代码。让程序在验证成功后输出下session的数据,同时还补了个exit担心是不是后面有什么代码把session给又给注销了~那个揪心的过程啊,结果session是被成功写入的,和我预想的结构一致。
    再后来还是进入了错误页面。于是我找到权限不足的错误处理函数。在里面也放了个session输出语句。看看验证前的session里面内容。执行结果,提示登陆成功->页面跳转->输出session,这时候session很郁闷的为空。瞬间郁闷了。
    不断测试发现只要一刷新页面,不管跳转还是刷新,session都会丢失。更奇葩的是,也不一定每次都丢失。某明奇妙的突然就能成功登陆。换个浏览器有不行了,关掉重开也又登陆不了了。有时候有突然可以。郁闷了相当久。
    于是我想:是不是我的机子上配置的环境有问题?感觉那也不对啊,如果是这样平时上网也应该会被影响了,于是我新建了个小页面来测试session的保留情况。测试发现我单独建个页面来使用session完全没问题。而且还有个很奇葩的现象。只要我打开过我单独建的那个session页面(那个页面就只有打开session,获取get值写入session,同时输出session数组的操作简单操作)不管不浏览器打开登录页面进行登陆的时候session就能够跨页面传递不丢失完成登录。
    于是又是各种郁闷各种找原因的过程。后来想到了session_id这货。于是我就找到了session_start语句的位置在后面加了句输出去sessionid的语句。结果发现果然每次输出的sessionid都不一样。于是可以确定丢失的不是session,而是sessionid
      这时候就在想有这么几种可能:
    1.sessionid没有成功传给浏览器
    2.浏览器没能成功记下sessionid
      3.sessionid没有被成功回传
    4.session生存时间太短
    让后查了下sessionid应该是被记录在cookie里面。于是我看了下浏览器设置。cookie是打开的。手动设置sessions保持时间,这些没有问题。让后我试着写了句设置cookie的语句。浏览器下始终出现不了cookie,刷新回传始终得不到cookie
      而后看到论坛里有人也有类似问题。猜测,应该是在session启动前有过输出。不够查看源文件的时候始终找不到输出。大概是错误哪一类的把。于是我把session从启动程序里面拿出来放在了整个程序的入口。在做测试的时候就成功了。

    以上那些过程是有点长额。一个小问题折腾了两天了,纠结呢先说明啊,我还是学生,是在边学边做的呵~一方面想把php掌握更好点。同时膜拜下大神的开发经验,主要为了看speedphp的框架思想。膜拜下大神呵~不得不说speedphp的结构看着真的相当优雅呵。作为初学者非常感谢老大的付出。
    说了这么多。发这个贴的目的呢有几个:
      第一是和大家分享下找问题的过程,让碰到类似问题的朋友有个借鉴。
      第二个,关于speedphp里面session的问题。个人把session是否启动放在配置里面在启动的时候调不知道是不是不大好。从我碰到的问题来看虽然只是解决了登陆不了的问题,但明显在原来的session启动位置之前一定是有异常输出的,只是不知道是什么。而类似的极有可能发生,不如直接去掉session自动启动功能以及配置项目。反正session_start函数也很短,何不移到入口呢?
      第三就是还有好几个问题到现在还没搞清楚的望jake老大解惑下:
        1.若无其他附加操作,单纯启动完session后session_id被记录到哪去了?
          查过很多资料,用火狐开发工具也看过,记录sessionid的应该是cookie,如果不修改配置的话应该是记录在phpsessid里面,用火狐去看也的确查到了那个字段和session_id的值。可是为什么打开浏览器缓存里面查cookie找不到不到相关cookie文件。那个写入session_id的cookie是怎么回事?还是说只要session_id都被记录到了同一个cookie中。如果是那样那同时登陆多个网站呢?
        2.也是关于session_id的
          网上有说session_id除了cookie外还有种说法是被记录到浏览器内存中。如何实现?
        3.关于seedphp中cookie的使用感觉还是有问题。是不是也是应为未知输出的原因?有没办法找到输出的是什么?
        4.关于页面跳转的问题
          我用js实现跳转页面发现老版本的IE无法兼容,但是应为有ajax接收回传数据语句的存在了,通过jump输出文件头的方法同样会被ajax接收进去判断,有没有什么办法可以兼容到老版本的跳转(主要是因为比较想用异步实现登陆);

2012-12-24 14:18:49

#2 jake

下一个utf8-bom清理,清理一下你文件里面的bom吧。你的情况是有时有有时没有session,比较接近bom的情况。

搜索论坛的应该可以找到非常多相关的资料。

http://www.speedphp.com/thread-3813-1-1.html

session的事情,在手册里面也说得很清楚,自己对照着改。http://www.speedphp.com/thread-3736-1-1.html

speedphp目前在用的系统,已经是非常大的一个数量级了。演示里面的只是很少的一小部分。如果连session这种小问题都是bug,那么就不可能那么多人使用了。

PS:帖子将转移到bug答复区 - 分类(非BUG已答复)

2012-12-24 16:17:02