【问题标题】:PHP Session data not being savedPHP 会话数据未保存
【发布时间】: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');

标签: php session


【解决方案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)上测试了代码。

            以下是要检查的内容:

            1. 您是否在任何地方调用 session_unset() 或 session_destroy()?这些函数将立即删除会话数据。如果我把这些放在我的脚本的末尾,它就会开始表现得和你描述的完全一样。

            2. 它在所有浏览器中的作用都相同吗?如果它在一个浏览器上运行而不在另一个浏览器上运行,则您可能在无法运行的浏览器上存在配置问题(即您关闭了 cookie 并忘记打开它们,或者错误地阻止了 cookie)。

            3. 会话文件夹是否可写?您无法使用 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 设置是主要问题,但这当然取决于您的服务器公司默认安装的内容。

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2023-03-14
                                      • 1970-01-01
                                      • 2016-07-31
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 1970-01-01
                                      相关资源
                                      最近更新 更多