会话未被识别


Session not recognized

我昨天花了大约45分钟试图研究和解决这个问题,所以希望有人有另一个想法,我可以尝试。

它开始于我的一个PHP脚本检测到会话$_SESSION为空,所以它停止执行其余的并为我抛出一个错误。

整个项目已经在该服务器上工作了至少半年没有任何问题,并且从那时起没有对代码或服务器进行过更新。

我是这样做的:我创建了一个新的PHP文件用于测试,确保在<?php ?>容器之前或之后没有任何内容,并编写以下代码:

session_start();
var_dump($_SESSION);
$_SESSION['test'] = 5;

然后我反复运行文件本身,它总是得到一个空会话。

我以前遇到过这种情况,所以我检查了会话文件位于服务器上的文件夹(在我的情况下是/var/lib/php5),确保它具有正确的目录所有者和权限,删除了其中的所有文件并重新启动apache。不行…

我再次运行该文件几次,每次运行都会创建一个新的会话文件,并且会话文件确实包含test=5条目,因此会话确实可以正确写入。

所以我检查了浏览器的cookie。据我所知,他们都在那里工作——phpsessid cookie和我的网站创建的另一个cookie都在那里。如果我删除所有的cookie,然后再次运行我的测试文件,那么phpsessid cookie将正常地重新创建,并且包含作为会话文件创建的相同的会话id。

我还将var_dump(session_id());添加到session_start();之后的代码中,并且每次脚本运行时它都会给我一个全新的会话id。

我们正在运行一个不支持session_status()的PHP版本,所以这不是一个选项,要么(不确定它到底会做什么,无论如何,我在这里盲目飞行)。

因此,我们知道会话是正确创建的,文件包含数据,cookie包含正确的id。

因此,据我所知,问题一定在于浏览器没有将cookie数据发送回服务器,或者服务器没有将cookie中的会话id识别为现有会话。

当我在测试时,Firefox想要安装更新,所以我运行了更新,但没有更改。Firefox被设置为接收cookie,我没有发现任何例外设置可以阻止它们。

考虑到这已经工作了6个多月了,一定是一些奇怪的事故损坏了什么,但我对Linux或PHP和会话的内部工作了解不够,甚至不知道从哪里开始诊断。

在某些时候,我确实尝试了session_write_close(),它没有改变任何东西(我的整个项目没有它一直工作得很好)。

唯一有效的方法是:

 $c = $_COOKIE['phpsessid'];
 session_name($c);
 session_start();
 var_dump($_SESSION);
 $_SESSION['test'] = 5;

但是我在大量的页面中使用session_start,并且不想遍历所有的页面来输入我不应该首先需要的代码…

任何想法吗?

提前感谢!

—EDIT—

我再次检查了这个问题,我可以确认cookie名称是phpsessid而不是PHPSESSID(感谢您指出这一点,@Cobra_Fast),因此这更接近问题的原因。我进入php.ini文件,将session.name的值放入引号中,然后重新启动apache,但仍然没有更改—cookie名称仍然是小写的。我没有在电脑上找到杀毒程序,而且我怀疑有任何网络安全程序可以做到这一点……如果PHP设置损坏了@Cobra_Fast建议,这是如何修复的?刚才编辑的文件没有帮助…

在进一步测试之后,我们发现了一件非常奇怪的事情:只有一台客户端计算机受此影响!我们在另一台计算机上运行代码,它正常工作,会话cookie被正确地写入和读取。所以根本不是服务器出了问题!我不知道这台计算机是如何将cookie名称转换为小写的——这完全没有意义,特别是因为它发生在两个浏览器中……但至少我们有一个"修复"的情况,这是我们无法控制的,因为他们立即说,他们要检查电脑,并重新安装它,如果需要的话。我现在很困惑,但至少已经结束了:-)谢谢你的回复!