PHP 会话数据未保存
Posted
技术标签:
【中文标题】PHP 会话数据未保存【英文标题】:PHP Session data not being saved 【发布时间】:2010-09-14 10:20:00 【问题描述】:我有一种“我发誓我没有碰过服务器”的情况。老实说,我没有接触任何 php 脚本。我遇到的问题是 php 数据没有保存在不同的页面或页面刷新之间。我知道正在正确创建一个新会话,因为我可以设置一个会话变量(例如 $_SESSION['foo'] = "foo" 并在同一页面上打印出来就好了。但是当我尝试使用同一个变量时在另一个页面上它没有设置!我可以在我的主机服务器上使用任何 php 函数或信息来查看发生了什么?
下面是一个示例脚本,目前无法在我的主机服务器上运行:
<?php
session_start();
if(isset($_SESSION['views']))
$_SESSION['views'] = $_SESSION['views']+ 1;
else
$_SESSION['views'] = 1;
echo "views = ". $_SESSION['views'];
echo '<p><a href="page1.php">Refresh</a></p>';
?>
'views' 变量在页面刷新后永远不会增加。我认为这是他们一方的问题,但我想首先确保我不是一个彻头彻尾的白痴。
这是我的主机服务器的 phpinfo()(PHP 版本 4.4.7):
【问题讨论】:
尝试替换你的行 echo 'Refresh
'; with header('位置:http://'.$_SERVER['HTTP_HOST'].'page1.php'); 【参考方案1】:感谢所有有用的信息。事实证明,我的主机更改了服务器并开始使用与 /var/php_sessions 不同的会话保存路径,该路径不再存在。一个解决方案是在我的所有脚本文件中声明ini_set(' session.save_path','SOME WRITABLE PATH');
,但这会很痛苦。我与主持人交谈,他们明确地将会话路径设置为确实存在的真实路径。希望这可以帮助任何遇到会话路径问题的人。
【讨论】:
【参考方案2】:检查以确保您没有将 https:// 与 http:// 混用。会话变量不会在安全会话和不安全会话之间流动。
【讨论】:
【参考方案3】:遇到了同样的问题——发生在我身上的是我们的服务器管理员将 session.cookie_secure 布尔值更改为 On,这意味着 cookie 只会通过安全连接发送。由于没有找到 cookie,php 每次都在创建一个新会话,因此没有看到会话变量。
【讨论】:
这是我的问题 - 我自己设置了 session.cookie_secure - 呵呵!奇怪的是,它在不安全的环境中持续工作了大约 2 周,然后突然停止 - 因此我没想到将两者联系起来。【参考方案4】:使用phpinfo()
并检查session.*
设置。
可能信息存储在 cookie 中,而您的浏览器不接受 cookie,诸如此类。
首先检查并返回结果。
您也可以通过print_r($_SESSION);
转储此变量并查看内容....
关于您的phpinfo()
,session.save_path
是有效的吗?您的网络服务器是否对该目录具有写入权限?
希望这会有所帮助。
【讨论】:
谢谢!我的问题是 cookie 未正确存储,导致所有会话变量在页面之间丢失。固定!【参考方案5】:我遇到了以下问题
index.php
<?
session_start();
$_SESSION['a'] = 123;
header('location:index2.php');
?>
index2.php
<?
session_start();
echo $_SESSION['a'];
?>
变量$_SESSION['a']
设置不正确。然后我相应地更改了index.php
<?
session_start();
$_SESSION['a'] = 123;
session_write_close();
header('location:index2.php');
?>
我不知道这在内部意味着什么,我只是向自己解释一下会话变量更改不够快:)
【讨论】:
与此有关的问题是,由于location
和index2.php
之间缺少空格,您的标头不会重定向header('location:index2.php');
@ 987654329@【参考方案6】:
检查会话保存路径是否可被 Web 服务器写入。
确保你打开了cookies..(我忘记了当我关闭它们来测试某些东西时)
使用带有 firebug 扩展的 firefox 来查看 cookie 是否被设置并传回。
在不相关的说明中,开始查看 php5,因为 php 4.4.9 是 php4 系列的最后一个。
【讨论】:
【参考方案7】:检查脚本运行所在文件夹的组和所有者是谁。如果 group id 或 user id 错误,例如设置为 root,会导致 session 无法正确保存。
【讨论】:
【参考方案8】:在增加之前检查“views”的值。如果出于某种奇怪的原因,它被设置为一个字符串,那么当你向它添加 1 时,它总是会返回 1。
if (isset($_SESSION['views']))
if (!is_numeric($_SESSION['views']))
echo "CRAP!";
++$_SESSION['views'];
else
$_SESSION['views'] = 1;
【讨论】:
【参考方案9】:好吧,我们可以消除代码错误,因为我在自己的服务器(PHP 5)上测试了代码。
以下是要检查的内容:
您是否在任何地方调用 session_unset() 或 session_destroy()?这些函数将立即删除会话数据。如果我把这些放在我的脚本的末尾,它就会开始表现得和你描述的完全一样。
它在所有浏览器中的作用都相同吗?如果它在一个浏览器上运行而不在另一个浏览器上运行,则您可能在无法运行的浏览器上存在配置问题(即您关闭了 cookie 并忘记打开它们,或者错误地阻止了 cookie)。
会话文件夹是否可写?您无法使用 is_writable() 对其进行测试,因此您需要转到文件夹(从 phpinfo() 中,它看起来像 /var/php_sessions)并确保实际创建了会话。
【讨论】:
【参考方案10】:如果您在 php5 中设置了会话,然后尝试在 php4 页面上读取它,它可能不会在正确的位置查找!使页面相同的php版本或设置session_path。
【讨论】:
【参考方案11】:我花了很长时间寻找类似问题的答案。这不是代码或设置的问题,因为非常相似的代码在同一服务器上的另一个 .php 中完美运行。原来问题是由大量数据保存到此页面的会话中引起的。在一个地方,我们有这样一行:$_SESSION['full_list'] = $full_list
其中$full_list
是从数据库加载的数据数组;每行是一个包含大约 150 个元素的数组。几年前最初编写代码时,DB 仅包含大约 1000 行,因此 $full_list
包含大约 100 个元素,每个元素是大约 20 个元素的数组。随着时间的推移,20 个元素变成了 150 行,1000 行变成了 17000 行,因此代码将接近 64 兆的数据存储到会话中。显然,由于存储了这么多数据,它拒绝存储任何其他内容。一旦我们将代码更改为在本地处理数据而不将其保存到会话中,一切都会完美运行。
【讨论】:
【参考方案12】:当我遇到类似问题时,我知道我找到的一个解决方案(OSX 与 Apache 1 并刚刚切换到 PHP5)是取消设置 1 个特定键(即 unset($_SESSION['key']);) 导致它没有保存。一旦我不再取消设置该键,它就保存了。我再也没有见过这种情况,除了在另一个站点上的那个服务器上,但那是一个不同的变量。两者都没有什么特别的。
感谢这个达里尔。这帮助了我。我正在删除一个会话变量,并且由于某种原因它阻止了会话提交。现在我只是将它设置为 null (这对我的应用程序来说很好),它可以工作。
【讨论】:
【参考方案13】:当我遇到类似问题时,我知道我找到的一个解决方案(OSX 与 Apache 1 并刚刚切换到 PHP5)是取消设置 1 个特定键(即 unset($_SESSION['key']);) 导致它没有保存。一旦我不再取消设置该键,它就保存了。我再也没有见过这种情况,除了在另一个站点上的那个服务器上,但那是一个不同的变量。两者都没有什么特别的。
【讨论】:
【参考方案14】:这是我在其他 cmets 中没有看到的一个常见问题:您的主机是否运行某种缓存?如果它们以某种方式自动缓存结果,您会得到这种行为。
【讨论】:
【参考方案15】:只是想补充一点,如果您不小心错过了页面上的 session_start() 语句,也会发生这种情况。
【讨论】:
【参考方案16】:检查你是否在使用 session_write_close();在任何地方,我在另一个会话之后立即使用它,然后尝试再次写入会话并且它不起作用..所以只需评论一下,sh * t out
【讨论】:
【参考方案17】:我将会话 cookie 路径设置为“//”而不是“/”。萤火虫太棒了。 希望它可以帮助某人。
【讨论】:
【参考方案18】:当我使用来自 www.domain.com/auth.php 并重定向到 domain.com/destpage.php 的安全页面时,我遇到了这个问题。我从 auth.php 链接中删除了 www 并且它起作用了。这让我很震惊,因为一切正常;但是,当我到达目的地时,会话尚未设置。
【讨论】:
【参考方案19】:一个经常被忽视的常见问题是 session_start() 命令之前不能有其他代码或额外的间距。
我之前遇到过这个问题,我在 session_start() 之前有一个空行,导致它无法正常工作。
【讨论】:
【参考方案20】:添加我的解决方案:
检查您是否访问了正确的域。我使用www.mysite.com
启动会话,并尝试从mysite.com
接收它(没有www
)。
我已经通过将所有域的 htaccess 重写添加到 www 来解决这个问题,以确保安全。
还要检查您使用的是 http 还是 https。
【讨论】:
确实,使用example.net 我的浏览器没有存储会话cookie。使用example.net,它起作用了。但是主机名怎么会有所作为呢? 猜猜每个子域都有自己的会话临时文件夹。www
也算作子域。
在我的情况下,应用程序总是发送完全相同的 Set-Cookie 标头 w/domain=www.example.net
,但 Firefox 会默默地(我找了 2 小时来记录这个)丢弃了 cookie,如果该站点被访问为example.net
。更改应用程序以发送domain=example.net
修复它。顺便说一句,在服务器上这是由 UseCanonicalName On
与 ServerName www.example.net
结合引起的。【参考方案21】:
编辑您的 php.ini。 我认为 session.gc_probability 的值为 1,所以设置为 0。
session.gc_probability=0
【讨论】:
【参考方案22】:我必须做的其他几件事(我有同样的问题:PHP 升级到 5.4 后没有会话保留)。你很多人不需要这些,这取决于你的服务器的 php.ini 包含什么(检查 phpinfio());
session.use_trans_sid=0 ; Do not add session id to URI (osc does this)
session.use_cookies=0; ; ensure cookies are not used
session.use_only_cookies=0 ; ensure sessions are OK to use IMPORTANT
session.save_path=~/tmp/osc; ; Set to same as admin setting
session.auto_start = off; Tell PHP not to start sessions, osc code will do this
基本上你的 php.ini 应该设置为无 cookie,并且会话参数必须与 osc 想要的一致。
您可能还需要更改 application_top.php 中的一些会话代码 sn-ps - 创建 tep_session_is_registered(...) 调用中不存在的对象(例如导航对象),将 $HTTP_ 变量设置为较新的$_SERVER 和其他一些针对空对象的 isset 测试(google for info)。我最终能够使用原始的 session.php 文件(包含/类和包含/函数)和稍微修改的 application_top.php 让事情重新开始。 php.ini 设置是主要问题,但这当然取决于您的服务器公司默认安装的内容。
【讨论】:
以上是关于PHP 会话数据未保存的主要内容,如果未能解决你的问题,请参考以下文章