我昨天花了大约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。
我们正在运行一个不支持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
并且不想通过所有页面输入我不应该首先需要的代码......
有什么想法吗?
提前致谢!
---编辑---
我再次检查了问题,我可以确认Cookie名称是phpsessid
而不是PHPSESSID
(感谢您指出这一点,@ Corpra_Fast),这样就越接近原因了这个问题。我进入php.ini
文件将session.name
的值放入引号,然后重新启动apache,但仍然没有变化 - cookie名称仍为小写。我还没有在计算机上找到防病毒程序,我怀疑是否有任何网络安全可以做到这一点......如果PHP设置已经损坏,如@Cobra_Fast建议的那样,怎么能修复?刚刚编辑文件没有帮助......
答案 0 :(得分:2)
经过多次测试后,我们发现了一个非常奇怪的事情: 只有一台客户端计算机受此影响!我们在另一台计算机上运行代码,它运行正常,会话cookie被正确编写和读取。 所以服务器根本不起作用! 我不知道这台计算机如何将cookie名称转换为小写 - 根本没有意义,特别是因为它发生在两个浏览器中...... 但至少我们对这种情况有一个“修复”,因为他们立即说他们要检查那台电脑并在需要时重新安装它,所以它不在我们手中。 我现在对此非常感到困惑,但至少它结束了:-) 谢谢你的回复!