提问人:Crackerjack 提问时间:10/1/2008 最后编辑:Ilmari KaronenCrackerjack 更新时间:1/16/2018 访问量:114067
PHP 会话数据未保存
PHP Session data not being saved
问:
我有一种“我发誓我没有碰服务器”的情况。老实说,我没有碰过任何 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);
关于你的,是有效的吗?您的 Web 服务器是否具有对此目录的写入权限?phpinfo()
session.save_path
希望这会有所帮助。
评论
在递增之前检查“views”的值。如果出于某种奇怪的原因,它被设置为字符串,那么当你向它添加 1 时,它将始终返回 1。
if (isset($_SESSION['views'])) {
if (!is_numeric($_SESSION['views'])) {
echo "CRAP!";
}
++$_SESSION['views'];
} else {
$_SESSION['views'] = 1;
}
检查会话保存路径是否可由 Web 服务器写入。
确保您已打开 Cookie。(我忘记了什么时候关闭它们来测试某些东西)
使用带有 firebug 扩展的 firefox 来查看 cookie 是否被设置并传输回去。
在不相关的说明中,开始查看 php5,因为 php 4.4.9 是 php4 系列的最后一个。
好吧,我们可以消除代码错误,因为我在自己的服务器(PHP 5)上测试了代码。
以下是要检查的内容:
你在任何地方调用 session_unset() 还是 session_destroy()?这些函数将立即删除会话数据。如果我把这些放在脚本的末尾,它就会开始表现得和你描述的一模一样。
它在所有浏览器中的作用都一样吗?如果它在一个浏览器上工作,而不是在另一个浏览器上工作,则您可能在无法正常工作的浏览器上遇到配置问题(即您关闭了 cookie 但忘记打开它们,或者错误地阻止了 cookie)。
会话文件夹是可写的吗?你不能用 is_writable() 来测试这一点,所以你需要转到文件夹(从 phpinfo() 它看起来像 /var/php_sessions),并确保会话确实被创建了。
当我遇到类似的问题时,我知道我发现的一个解决方案(带有 Apache 1 的 OSX 并且刚刚切换到 PHP5)是取消设置 1 个特定键(即 unset($_SESSION['key']);)导致它无法保存。只要我没有再取消设置该键,它就会保存。我再也没有见过这个,除了在另一个站点的服务器上,但它是一个不同的变量。也没什么特别的。
这是我在其他评论中没有看到解决的一个常见问题:您的主机是否运行某种缓存?如果它们以某种方式自动缓存结果,则会出现这种行为。
感谢您提供所有有用的信息。事实证明,我的主机更换了服务器并开始使用除 /var/php_sessions 以外的其他会话保存路径,该路径不再存在。一个解决方案是在我所有的脚本文件中声明,但那将是一个痛苦。我与主持人进行了交谈,他们明确地将会话路径设置为确实存在的真实路径。希望这对任何遇到会话路径问题的人有所帮助。ini_set(' session.save_path','SOME WRITABLE PATH');
只是想补充一点,如果您不小心错过了页面上的 session_start() 语句,也会发生这种情况。
当我遇到类似的问题时,我知道我发现的一个解决方案(带有 Apache 1 的 OSX 并且刚刚切换到 PHP5)是取消设置 1 个特定键(即 unset($_SESSION['key']);)导致它无法保存。只要我没有再取消设置该键,它就会保存。我再也没有见过这个,除了在另一个站点的服务器上,但它是一个不同的变量。也没什么特别的。
谢谢你的这个达里尔。这帮助了我。我正在删除一个会话变量,并且由于某种原因,它阻止了会话提交。现在我只是将其设置为 null(这对我的应用程序来说很好),并且它有效。
检查您是否正在使用 session_write_close();在任何地方,我在另一个会话后立即使用它,然后尝试再次写入会话,但它不起作用。所以只要评论那个 sh*t 出来
如果你在 php5 中设置了一个会话,然后尝试在 php4 页面上读取它,它可能看起来不正确!使页面具有相同的 php 版本或设置session_path。
检查运行脚本的文件夹的组和所有者是谁。如果组 ID 或用户 ID 错误,例如设置为 root,则会导致会话无法正确保存。
有同样的问题 - 发生在我身上的是我们的服务器管理员将session.cookie_secure布尔值更改为 On,这意味着 cookie 将仅通过安全连接发送。由于没有找到 cookie,php 每次都会创建一个新会话,因此看不到会话变量。
评论
我花了很长时间寻找类似问题的答案。这不是代码或设置的问题,因为非常相似的代码在同一服务器上的另一个 .php 中完美运行。事实证明,该问题是由于在此页面的会话中保存了大量数据引起的。在一个地方,我们有这样一行:从数据库加载的数据数组在哪里;每行是一个包含大约 150 个元素的数组。几年前最初编写代码时,数据库只包含大约 1000 行,因此包含大约 100 个元素,每个元素是一个包含大约 20 个元素的数组。随着时间的流逝,20 个元素变成了 150 个元素,1000 行变成了 17000 行,因此代码将近 64 meg 的数据存储到会话中。显然,由于存储了如此多的数据,它拒绝存储任何其他内容。一旦我们更改了代码以在本地处理数据而不将其保存到会话中,一切都运行良好。$_SESSION['full_list'] = $full_list
$full_list
$full_list
我将会话cookie路径设置为“//”而不是“/”。Firebug太棒了。 希望它对某人有所帮助。
我遇到了以下问题
索引.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');
?>
我不知道这在内部意味着什么,我只是向自己解释会话变量更改不够快:)
评论
location
index2.php
header('location:index2.php');
header('location: index2.php');
检查以确保您没有将 https:// 与 http:// 混合。会话变量不会在安全会话和不安全会话之间流动。
当我使用重定向到 domain.com/destpage.php 的安全页面时,我遇到了这个问题 www.domain.com/auth.php。我从auth.php链接中删除了www,它起作用了。这让我感到震惊,因为一切都以其他方式运作;不过,当我到达目的地时,会话尚未设置。
一个经常被忽视的常见问题是,在 session_start() 命令之前不能有其他代码或额外的空格。
我以前遇到过这个问题,在 session_start() 之前有一个空行,导致它无法正常工作。
编辑你的 php.ini。
我认为 session.gc_probability 的值是 1,所以将其设置为 0。
session.gc_probability=0
添加我的解决方案:
检查您是否访问了正确的域。我用来启动会话,并尝试从(没有 ).www.mysite.com
mysite.com
www
我通过将所有域的 htaccess 重写添加到 www 来解决这个问题,以确保安全。
还要检查您使用的是 http 还是 https。
评论
www
domain=www.example.net
example.net
domain=example.net
UseCanonicalName On
ServerName www.example.net
我必须做的其他几件事(我有同样的问题: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 设置是主要问题,但这当然取决于您的服务器公司安装的默认值。
评论