1

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

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

整个项目在该服务器上运行了至少半年,没有任何问题,此后代码或服务器没有更新。

这是我当时所做的:我创建了一个新的 PHP 文件进行测试,确保<?php ?>容器之前或之后没有任何内容,然后编写了以下代码:

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

然后我自己反复运行文件,它总是想出一个空会话。

我之前遇到过这个问题,所以我检查了服务器上会话文件所在的文件夹(在我的情况下/var/lib/php5),确保它具有正确的目录所有者和权限,删除其中的所有文件并重新启动 apache。没有骰子...

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

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

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

我们正在运行一个尚不支持的 PHP 版本session_status(),所以这也不是一个选择(不确定它会做什么,反正我在这里很盲目地飞行)。

因此,我们知道会话创建正确,文件包含数据,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在大量页面中使用并且不想通过所有这些页面来输入我一开始就不需要的代码......

有什么想法吗?

提前致谢!

- - 编辑 - -

我再次检查了这个问题,我可以确认 cookie 名称phpsessid不是PHPSESSID(感谢您指出这一点,@Cobra_Fast),所以这越来越接近问题的原因。我进入php.ini文件将值session.name放入引号中,然后重新启动 apache,但仍然没有变化 - cookie 名称仍然是小写的。我还没有在计算机上找到防病毒程序,并且我怀疑是否有任何网络安全可以做到这一点......如果 PHP 设置如@Cobra_Fast 建议的那样损坏,如何解决这个问题?刚刚编辑文件没有帮助......

4

1 回答 1

2

又测试了一番,我们发现了一件很奇怪的事情:只有一台客户端电脑受到了影响!我们在另一台计算机上运行代码,它工作正常,会话 cookie 被正确写入和读取。所以根本不是服务器在起作用!我不知道这台计算机如何只是将 cookie 名称转换为小写 - 这根本没有意义,特别是因为它发生在两个浏览器中......但至少我们有一个针对这种情况的“修复”,它是由于他们立即表示将检查该计算机并在需要时重新安装它,因此我们无法控制。我现在对此感到非常困惑,但至少结束了:-) 感谢您的回复!

于 2013-03-04T16:06:15.390 回答