PHP 会话数据未保存

PHP Session data not being saved

提问人:Crackerjack 提问时间:10/1/2008 最后编辑:Ilmari KaronenCrackerjack 更新时间:1/16/2018 访问量:114067

问:

我有一种“我发誓我没有碰服务器”的情况。老实说,我没有碰过任何 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():alt text

PHP 会话

评论

0赞 Nikita Yo LAHOLA 4/29/2015
尝试替换行回声 '<p><a href=“page1.php”>Refresh</a></p>';with header('位置: http://'.$_SERVER['HTTP_HOST'].'第1页.php');

答:

8赞 vIceBerg 10/1/2008 #1

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

也许信息存储在 cookie 中,而您的浏览器不接受 cookie,类似的东西。

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

您也可以执行此变量的转储并查看内容...。print_r($_SESSION);

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

希望这会有所帮助。

评论

0赞 tozhan 8/16/2015
谢谢!我的问题是 cookie 未正确存储,导致所有会话变量在页面之间丢失。固定!
2赞 nickf 10/1/2008 #2

在递增之前检查“views”的值。如果出于某种奇怪的原因,它被设置为字符串,那么当你向它添加 1 时,它将始终返回 1。

if (isset($_SESSION['views'])) {
    if (!is_numeric($_SESSION['views'])) {
        echo "CRAP!";
    }
    ++$_SESSION['views'];
} else {
    $_SESSION['views'] = 1;
}
5赞 DGM 10/1/2008 #3

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

确保您已打开 Cookie。(我忘记了什么时候关闭它们来测试某些东西)

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

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

2赞 Nathan Strong 10/1/2008 #4

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

以下是要检查的内容:

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

  2. 它在所有浏览器中的作用都一样吗?如果它在一个浏览器上工作,而不是在另一个浏览器上工作,则您可能在无法正常工作的浏览器上遇到配置问题(即您关闭了 cookie 但忘记打开它们,或者错误地阻止了 cookie)。

  3. 会话文件夹是可写的吗?你不能用 is_writable() 来测试这一点,所以你需要转到文件夹(从 phpinfo() 它看起来像 /var/php_sessions),并确保会话确实被创建了。

1赞 Darryl Hein 10/1/2008 #5

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

1赞 rg88 10/1/2008 #6

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

42赞 Crackerjack 10/2/2008 #7

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

1赞 Noccy 5/31/2009 #8

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

2赞 ndebellas 7/1/2009 #9

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

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

1赞 Ani 7/31/2009 #10

检查您是否正在使用 session_write_close();在任何地方,我在另一个会话后立即使用它,然后尝试再次写入会话,但它不起作用。所以只要评论那个 sh*t 出来

2赞 Harry 4/10/2010 #11

如果你在 php5 中设置了一个会话,然后尝试在 php4 页面上读取它,它可能看起来不正确!使页面具有相同的 php 版本或设置session_path。

3赞 buzzy blogger 4/11/2010 #12

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

9赞 Shane N 10/12/2010 #13

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

评论

1赞 muz the axe 8/26/2016
这是我的问题——我自己设定了session.cookie_secure——呃!奇怪的是,它在不安全的环境中继续工作了大约 2 周,然后突然停止——因此我没有想过将两者联系起来。
2赞 Aleks G 6/22/2011 #14

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

1赞 Slawa 7/12/2011 #15

我将会话cookie路径设置为“//”而不是“/”。Firebug太棒了。 希望它对某人有所帮助。

6赞 harry 7/21/2011 #16

我遇到了以下问题

索引.php

<?
    session_start();
    $_SESSION['a'] = 123;
    header('location:index2.php');
?>

索引2.php

<?
  session_start();
  echo $_SESSION['a'];
?>

变量设置不正确。然后我改变了$_SESSION['a']index.php

<?
    session_start();
    $_SESSION['a'] = 123;
    session_write_close();
    header('location:index2.php');
?>

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

评论

0赞 Funk Forty Niner 9/7/2013
这样做的问题是,由于 和 <= 之间缺少空格,您的标头不会重定向,但这将 =>locationindex2.phpheader('location:index2.php');header('location: index2.php');
13赞 paul 10/25/2011 #17

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

1赞 Sean Anderson 1/13/2012 #18

当我使用重定向到 domain.com/destpage.php 的安全页面时,我遇到了这个问题 www.domain.com/auth.php。我从auth.php链接中删除了www,它起作用了。这让我感到震惊,因为一切都以其他方式运作;不过,当我到达目的地时,会话尚未设置。

1赞 hyarion 6/20/2012 #19

一个经常被忽视的常见问题是,在 session_start() 命令之前不能有其他代码或额外的空格。

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

1赞 emaniacs 9/24/2012 #20

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

session.gc_probability=0
1赞 Avatar 10/3/2014 #21

添加我的解决方案:

检查您是否访问了正确的域。我用来启动会话,并尝试从(没有 ).www.mysite.commysite.comwww

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

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

评论

0赞 xebeche 7/13/2017
事实上,使用 example.net 我的浏览器并没有存储会话cookie。有了 example.net 它就奏效了。但是,主机名怎么会有所作为呢?
0赞 Avatar 7/13/2017
猜猜每个子域都有自己的会话临时文件夹。 也算作子域。www
0赞 xebeche 7/15/2017
就我而言,应用程序总是发送完全相同的 Set-Cookie 标头,但 Firefox 默默地(我寻找了 2 小时来记录此内容的方法)如果该站点被访问为 .更改应用程序,使其发送修复它。顺便说一句,在服务器上,这是由 w/ 一起引起的。domain=www.example.netexample.netdomain=example.netUseCanonicalName OnServerName www.example.net
0赞 Pete855217 10/4/2014 #22

我必须做的其他几件事(我有同样的问题:PHP 升级到 5.4 后没有 sesson 保留)。你不需要这些,这取决于你的服务器的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 变量,并为空对象(google for info)进行一些其他 isset 测试。我最终能够使用原始会话.php文件(includes/classes 和 includes/functions),并稍微修改application_top.php以使事情重新开始。php.ini 设置是主要问题,但这当然取决于您的服务器公司安装的默认值。