PHP会话数据不被保存
我有一个“我发誓我没有碰到服务器”的情况。 我真的没有触及任何的PHP脚本。 我遇到的问题是PHP数据不被保存在不同的页面或页面刷新。 我知道正在创build一个新的会话,因为我可以设置一个会话variables(例如$ _SESSION ['foo'] =“foo”),并在同一页面上打印出来,但是当我尝试使用相同的variables在另一个页面上没有设置!是否有任何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'variables不会增加。 我认为这是他们的问题,但我想确保我不是一个完全白痴。
这是我主机的服务器(PHP版本4.4.7)phpinfo():
感谢所有有用的信息。 事实certificate,我的主机改变了服务器,并开始使用不同于/ var / php_sessions的另一个不存在的会话保存path。 解决办法是宣布ini_set(' session.save_path','SOME WRITABLE PATH');
在我所有的脚本文件中,但这将是一个痛苦。 我和主持人交谈,他们明确地设定会话path为真实存在的path。 希望这有助于任何人有会议path麻烦。
请检查以确保您没有将http://与http://混合。 会话variables不会在安全会话和不安全会话之间stream动。
有同样的问题 – 发生在我身上的是我们的服务器pipe理员将session.cookie_secure布尔值更改为On,这意味着Cookie将只能通过安全连接发送。 由于没有findcookie,php每次都创build一个新的会话,因此会话variables没有被看到。
使用phpinfo()
并检查session.*
设置。
也许这些信息存储在cookies中,而你的浏览器不接受cookies,就像这样。
首先检查并返回结果。
你也可以做一个print_r($_SESSION);
有这个variables的转储,看看内容….
关于你的phpinfo()
, session.save_path
有效? 你的networking服务器是否可以写入这个目录?
希望这可以帮助。
我有以下问题
的index.php
<? session_start(); $_SESSION['a'] = 123; header('location:index2.php'); ?>
index2.php
<? session_start(); echo $_SESSION['a']; ?>
variables$_SESSION['a']
设置不正确。 然后我改变了index.php
<? session_start(); $_SESSION['a'] = 123; session_write_close(); header('location:index2.php'); ?>
我不知道这是什么内部的意思,我只是向自己解释,会议variables变化不够快:)
检查会话保存path是否可由Web服务器写入。
确保你有cookies打开..(我忘了,当我把它们closurestesting的东西)
使用Firefox的萤火虫扩展程序,看看是否正在设置和传回曲奇。
在一个不相关的说明中,开始看php5,因为php 4.4.9是php4系列的最后一个。
检查组和所有者是脚本运行的文件夹的名称。 如果组ID或用户标识错误,例如设置为root,则会导致会话不能正确保存。
在增加之前检查“视图”的值。 如果出于某种奇怪的原因,它被设置为一个string,那么当你添加1时,它总是返回1。
if (isset($_SESSION['views'])) { if (!is_numeric($_SESSION['views'])) { echo "CRAP!"; } ++$_SESSION['views']; } else { $_SESSION['views'] = 1; }
那么,我们可以消除代码错误,因为我testing了我自己的服务器上的代码(PHP 5)。
以下是要检查的内容:
-
你在任何地方调用session_unset()或session_destroy()吗? 这些function将立即删除会话数据。 如果我把这些放在脚本的末尾,它就像你描述的一样。
-
它在所有的浏览器中都是一样的吗? 如果它在一个浏览器而不是另一个浏览器上运行,那么您可能会在无法正常运行的浏览器上出现configuration问题(例如,您closures了cookie并忘记打开它们,或者错误地阻止了cookie)。
-
会话文件夹是否可写? 你不能用is_writable()来testing这个,所以你需要去到文件夹(从phpinfo()看起来像/ var / php_sessions),并确保会话实际上正在创build。
如果你在php5中设置一个会话,然后尝试阅读一个php4页面,它可能不会在正确的地方! 使页面相同的PHP版本或设置session_path。
我花了很多年寻找类似的问题的答案。 这不是代码或设置的问题,因为一个非常类似的代码在同一台服务器上的另一个.php中完美工作。 原来这个问题是由于大量的数据被保存到这个页面的会话中造成的。 在一个地方,我们有这样的一行: $_SESSION['full_list'] = $full_list
其中$full_list
是从数据库加载的数据的数组; 每行都是大约150个元素的数组。 当代码最初是在几年前编写时,DB只包含大约1000行,所以$full_list
包含大约100个元素,每个元素都是大约20个元素的数组。 随着时间的推移,20个元素变成了150行,1000行变成了17000行,所以代码存储了接近64兆的数据。 显然,这些数据被存储,它拒绝存储任何东西。 一旦我们改变了代码在本地处理数据而不保存到会话中,一切都运行良好。
我知道一个解决scheme,我发现(OSX与Apache 1,只是切换到PHP5),当我有一个类似的问题是,取消设置1特定键(即未设置($ _ SESSION ['键']);)导致它不能保存。 一旦我没有取消这个密钥,它就保存了。 我再也没有见过这个,除了在另一个网站上的服务器,但这是一个不同的variables。 没有什么特别的。
感谢这个Darryl。 这帮助了我。 我正在删除一个会话variables,出于某种原因,它保持会议提交。 现在我只是把它设置为null(这对我的应用程序很好),它的工作原理。
我知道一个解决scheme,我发现(OSX与Apache 1,只是切换到PHP5),当我有一个类似的问题是,取消设置1特定键(即未设置($ _ SESSION ['键']);)导致它不能保存。 一旦我没有取消这个密钥,它就保存了。 我再也没有见过这个,除了在另一个网站上的服务器,但这是一个不同的variables。 没有什么特别的。
这是我在其他评论中没有看到的一个常见问题:你的主机是否运行某种caching? 如果他们以某种方式自动caching结果,你会得到这种行为。
只是想补充一点,如果你不小心丢失了页面上的session_start()语句,也会发生这种情况。
我有会话cookiepath设置为“//”而不是“/”。 Firebug真棒。 希望它有助于某人。
在使用来自www.domain.com/auth.php的redirect到domain.com/destpage.php的安全页面时,我遇到了这个问题。 我从auth.php链接中删除了www,它工作。 这扔了我,因为一切工作,否则; 当我到达目的地时,会议没有被设定。
常常忽略的一个常见问题是,在session_start()命令之前,不得有其他代码或额外的空格。
我之前有session_start()之前有一个空行的问题,导致它不能正常工作。
添加我的解决scheme
检查您是否访问了正确的域名 。 我正在使用www.mysite.com
开始会话,并试图从mysite.com
(没有www
)接收它。
我已经解决了这个问题,通过添加一个htaccess的所有域名重写到www安全的一面/网站。
另外检查你是否使用http或https。
检查你是否使用session_write_close(); 在任何地方,我正在使用这个权利,然后再尝试再次写入会话,这是不工作..所以只是评论说sh * t出
编辑你的php.ini我认为session.gc_probability的值是1,所以设置为0
session.gc_probability合= 0
我还需要做的另一件事情(我有同样的问题: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应该被设置为没有cookies,会话参数必须与osc想要的一致。
您可能还需要更改application_top.php中的几个会话代码片段 – 创buildtep_session_is_registered(…)调用(例如导航对象)中不存在的对象,将$ HTTP_variables设置为更新的$ _SERVERvariables,几个其他issettesting空对象(谷歌的信息)。 我结束了能够使用原来的sessions.php文件(包括/类和包括/函数)稍微修改application_top.php让事情再次进行。 php.ini设置是主要的问题,但这当然取决于你的服务器公司已经安装的默认设置。