58

我有一种“我发誓我没有碰过服务器”的情况。老实说,我没有接触任何 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): 替代文字

4

22 回答 22

42

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

于 2008-10-01T21:57:04.140 回答
13

检查以确保您没有将 https:// 与 http:// 混合。会话变量不会在安全会话和不安全会话之间流动。

于 2011-10-25T01:38:28.447 回答
9

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

于 2010-10-11T16:16:45.987 回答
8

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

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

首先检查并返回结果。

你也可以做 print_r($_SESSION);一个转储这个变量并查看内容....

关于你的phpinfo(),是session.save_path一个有效的吗?您的 Web 服务器是否对该目录具有写入权限?

希望这可以帮助。

于 2008-10-01T02:04:27.317 回答
6

我有以下问题

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

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

于 2011-07-21T14:46:42.233 回答
5

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

确保你打开了cookies..(当我关闭它们来测试某些东西时我忘记了)

使用带有 firebug 扩展的 firefox 来查看 cookie 是否被设置并传回。

在不相关的说明中,开始查看 php5,因为 php 4.4.9 是 php4 系列的最后一个。

于 2008-10-01T02:23:22.620 回答
3

检查脚本运行所在文件夹的组和所有者是谁。如果 group id 或 user id 错误,例如设置为 root,会导致 session 无法正确保存。

于 2010-04-11T09:15:41.360 回答
2

在增加它之前检查“views”的值。如果出于某种奇怪的原因,它被设置为一个字符串,那么当你给它加 1 时,它总是返回 1。

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}
于 2008-10-01T02:06:09.433 回答
2

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

以下是要检查的内容:

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

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

  3. 会话文件夹是否可写?您无法使用 is_writable() 对其进行测试,因此您需要转到该文件夹​​(从 phpinfo() 中,它看起来像 /var/php_sessions)并确保实际创建了会话。

于 2008-10-01T04:36:39.867 回答
2

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

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

于 2009-06-30T21:50:07.020 回答
2

如果您在 php5 中设置会话,然后尝试在 php4 页面上读取它,它可能不会在正确的位置查找!使页面具有相同的 php 版本或设置 session_path。

于 2010-04-10T14:50:58.340 回答
2

我花了很长时间寻找类似问题的答案。这不是代码或设置的问题,因为非常相似的代码在同一服务器上的另一个 .php 中完美运行。原来问题是由大量数据保存到此页面的会话中引起的。在一个地方,我们有这样一行:从数据库加载的数据数组$_SESSION['full_list'] = $full_list在哪里?$full_list每行是一个包含大约 150 个元素的数组。几年前最初编写代码时,数据库只包含大约 1000 行,所以$full_list包含大约 100 个元素,每个元素是大约 20 个元素的数组。随着时间的推移,20 个元素变成了 150 行,1000 行变成了 17000 行,因此代码将接近 64 兆的数据存储到会话中。显然,由于存储了这么多数据,它拒绝存储任何其他内容。一旦我们更改代码以在本地处理数据而不将其保存到会话中,一切都运行良好。

于 2011-06-21T16:32:33.817 回答
1

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

于 2008-10-01T05:52:31.823 回答
1

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

于 2008-10-01T07:18:27.933 回答
1

只是想补充一点,如果您不小心错过了页面上的 session_start() 语句,也会发生这种情况。

于 2009-05-31T14:11:38.950 回答
1

检查您是否正在使用 session_write_close(); 在任何地方,我在另一个会话之后立即使用它,然后尝试再次写入会话并且它不工作..所以只需评论那个sh * t out

于 2009-07-31T11:43:56.333 回答
1

我将会话 cookie 路径设置为“//”而不是“/”。萤火虫太棒了。希望它可以帮助某人。

于 2011-07-12T14:13:42.397 回答
1

当我使用来自 www.domain.com/auth.php 并重定向到 domain.com/destpage.php 的安全页面时,我遇到了这个问题。我从 auth.php 链接中删除了 www 并且它起作用了。这让我很震惊,因为一切正常;我到达目的地时没有设置会话。

于 2012-01-12T18:02:03.587 回答
1

一个经常被忽视的常见问题是 session_start() 命令之前必须没有其他代码或额外的间距。

我之前遇到过这个问题,在 session_start() 之前我有一个空行,导致它无法正常工作。

于 2012-06-20T10:58:26.597 回答
1

编辑您的 php.ini。
我认为 session.gc_probability 的值为 1,所以设置为 0。

session.gc_probability=0
于 2012-09-23T18:01:24.790 回答
1

添加我的解决方案:

检查您是否访问了正确的域。我www.mysite.com用来启动会话,并尝试从mysite.com(不带www)接收它。

我已经通过将所有域的 htaccess 重写添加到 www 来解决这个问题,以确保安全。

还要检查您使用的是 http 还是 https。

于 2014-10-03T14:35:50.397 回答
0

我必须做的另外几件事(我有同样的问题: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 中的一些会话代码片段 - 创建 tep_session_is_registered(...) 调用中不存在的对象(例如导航对象),将 $HTTP_ 变量设置为较新的 $_SERVER 变量和很少有其他针对空对象的 isset 测试(谷歌获取信息)。我最终能够使用原始的 session.php 文件(包含/类和包含/函数)和稍微修改的 application_top.php 来让事情重新开始。php.ini 设置是主要问题,但这当然取决于您的服务器公司默认安装的内容。

于 2014-10-04T10:29:04.067 回答