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');
?>

我不知道这在内部意味着什么,我只是向自己解释一下会话变量更改不够快:)

【讨论】:

与此有关的问题是,由于locationindex2.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 OnServerName 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 会话数据未保存的主要内容,如果未能解决你的问题,请参考以下文章

数据未保存在会话变量中

会话数据未保存在插件控制器十月 CMS 中

跨会话保存数据-PHP

php表单mysql更新保存数据

使用自定义 php 会话路径时,HybridAuth 未进行身份验证

如何将 PHP 会话数据保存到数据库而不是文件系统中?