昨天我花了大约 45 分钟试图研究和解决这个问题,所以希望有人有另一个想法我可以尝试。
它从我的一个 PHP 脚本开始,检测到会话$_SESSION
为空,因此它停止执行其余部分并为我抛出错误。
整个项目在该服务器上运行了至少半年,没有任何问题,此后代码或服务器没有更新。
这是我当时所做的:我创建了一个新的 PHP 文件进行测试,确保<?php ?>
容器之前或之后没有任何内容,然后编写了以下代码:
session_start();
var_dump($_SESSION);
$_SESSION['test'] = 5;
然后我自己反复运行文件,它总是想出一个空会话。
我之前遇到过这个问题,所以我检查了服务器上会话文件所在的文件夹(在我的情况下/var/lib/php5
),确保它具有正确的目录所有者和权限,删除其中的所有文件并重新启动 apache。没有骰子...
我再次运行该文件几次,每次运行都创建了一个新的会话文件,并且会话文件确实包含 test=5 条目,因此会话确实可以正确写入。
所以我检查了浏览器的cookies。据我所知,它们在那里并且正在工作 - phpsessid cookie 和我的网站创建的另一个 cookie 都在那里。如果我删除所有 cookie,然后再次运行我的测试文件,则phpsessid
cookie 会正常重新创建,并且确实包含作为会话文件创建的相同会话 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 建议的那样损坏,如何解决这个问题?刚刚编辑文件没有帮助......