PHP会话数据未保存

时间:2020-03-06 14:57:28  来源:igfitidea点击:

我遇到了一种"我发誓我没碰服务器"的情况。老实说,我没有碰过任何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"变量永远不会增加。我认为这对他们来说是个问题,但我想确保我首先不是一个完全的白痴。

这是我的主机服务器(PHP版本4.4.7)的phpinfo():

解决方案

使用phpinfo()并检查session。*设置。

也许信息存储在cookie中,而浏览器不接受cookie,诸如此类。

首先检查,然后返回结果。

我们还可以执行print_r($ _ SESSION);以转储该变量并查看其内容...。

关于phpinfo(),session.save_path是有效的吗?Web服务器是否对此目录具有写权限?

希望这可以帮助。

递增之前,请检查"视图"的值。如果出于某种奇怪的原因,将其设置为字符串,那么当我们将其添加1时,它将始终返回1.

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}

检查会话保存路径是否可由Web服务器写入。

确保我们已打开Cookie。(我忘记了将它们关闭以进行测试时会忘记)

将firefox与firebug扩展一起使用,以查看是否已设置cookie并将其传输回去。

与此无关的是,开始研究php5,因为php 4.4.9是php4系列的最后一个。

好吧,因为我在自己的服务器(PHP 5)上测试了代码,所以我们可以消除代码错误。

这是要检查的内容:

  • 我们要在任何地方调用session_unset()或者session_destroy()吗?这些功能将立即删除会话数据。如果我将这些放在脚本的末尾,它将开始表现出完全像我们描述的那样。
  • 它在所有浏览器中的作用都一样吗?如果它可以在一个浏览器上运行而不能在另一个浏览器上运行,则可能是在无法运行的浏览器上出现配置问题(即我们关闭了Cookie并忘记打开它们,或者误阻止了cookie)。
  • 会话文件夹可写吗?我们无法使用is_writable()对此进行测试,因此我们需要转到文件夹(从phpinfo()看起来类似于/ var / php_sessions),并确保会话实际上已创建。

我知道一个解决方案(OSX和Apache 1并刚切换到PHP5),当我遇到类似的问题时,就是取消设置1个特定键(即unset($ _ SESSION ['key']);)导致它无法保存。一旦我不再取消设置该密钥,它就会保存下来。除了在另一个站点上的服务器上,我再也没有看到这种情况,但是那是一个不同的变量。两者都没什么特别的。

这是我在其他评论中没有看到的一个常见问题:主机是否正在运行某种缓存?如果它们以某种方式自动缓存结果,我们将得到这种行为。

感谢我们提供所有有用的信息。事实证明,我的主机更改了服务器并开始使用/ var / php_sessions以外的其他会话保存路径,该路径不再存在。一种解决方案是在我所有的脚本文件中声明ini_set('session.save_path','SOME WRITABLE PATH');,但这会很麻烦。我与主机进行了交谈,他们明确地将会话路径设置为确实存在的真实路径。希望这可以帮助遇到会话路径问题的任何人。

只是想添加一点说明,如果我们不小心错过了页面上的session_start()语句,也会发生这种情况。

I know one solution I found (OSX with Apache 1 and just switched to PHP5) when I had a similar problem was that unsetting 1 specific key (ie unset($_SESSION['key']);) was causing it not to save. As soon as I didn't unset that key any more it saved. I have never seen this again, except on that server on another site, but then it was a different variable. Neither were anything special.

感谢这一位达里尔。这帮助了我。我正在删除会话变量,由于某种原因,它使会话无法提交。现在我只是将其设置为null(这对我的应用程序来说很好),并且可以正常工作。

检查我们是否正在使用session_write_close();在任何地方,我都在另一个会话之后使用此权限,然后尝试再次写入该会话,但它不起作用..因此,只需注释一下即可

如果我们在php5中设置了会话,则尝试在php4页面上阅读该会话,它可能找不到正确的位置!使页面具有相同的php版本或者设置session_path。

检查谁是脚本的运行文件夹的组和所有者。如果组ID或者用户ID错误,例如设置为root,将导致会话无法正确保存。

遇到同样的问题,发生在我身上的是我们的服务器管理员将session.cookie_secure布尔值更改为On,这意味着cookie仅通过安全连接发送。由于找不到cookie,因此php每次都会创建一个新会话,因此不会看到会话变量。