我有一个“我发誓我没有碰到服务器”的情况。老实说,我没有触及任何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):
答案 0 :(得分:41)
感谢所有有用的信息。事实证明,我的主机更改了服务器并开始使用除/ var / php_sessions之外的其他会话保存路径,这些路径不再存在。一个解决方案就是在我的所有脚本文件中声明ini_set(' session.save_path','SOME WRITABLE PATH');
,但那会很痛苦。我与主机进行了交谈,他们明确地将会话路径设置为确实存在的真实路径。希望这可以帮助任何有会话路径麻烦的人。
答案 1 :(得分:12)
检查以确保您没有将https://与http://混合使用。会话变量不会在安全会话和不安全会话之间流动。
答案 2 :(得分:9)
有同样的问题 - 我发生的事情是我们的服务器管理员将session.cookie_secure布尔值更改为On,这意味着cookie只会通过安全连接发送。由于没有找到cookie,php每次都会创建一个新的会话,因此没有看到会话变量。
答案 3 :(得分:7)
使用phpinfo()
并检查session.*
设置。
也许这些信息存储在Cookie中,而您的浏览器也不接受Cookie,就像那样。
首先检查并返回结果。
您还可以执行print_r($_SESSION);
转储此变量并查看内容....
关于phpinfo()
,session.save_path
是否有效?您的Web服务器是否具有对此目录的写访问权限?
希望这有帮助。
答案 4 :(得分:6)
我有以下问题
的index.php
<?
session_start();
$_SESSION['a'] = 123;
header('location:index2.php');
?>
index2.php
<?
session_start();
echo $_SESSION['a'];
?>
未正确设置变量$_SESSION['a']
。然后我按照<{1}}改变了
index.php
我不知道这内部意味着什么,我只是向自己解释会话变量变化不够快:)
答案 5 :(得分:5)
检查Web服务器是否可以写入会话保存路径。
确保你打开了曲奇饼干...(当我把它们关掉来测试时我会忘记)
将firefox与firebug扩展名一起使用,以查看cookie是否已设置并传回。
并且在一个不相关的说明中,开始查看php5,因为php 4.4.9是php4系列的最后一个。
答案 6 :(得分:3)
检查组和所有者是运行脚本的文件夹的对象。如果组ID或用户ID错误,例如设置为root,则会导致会话无法正确保存。
答案 7 :(得分:2)
在增加之前检查“views”的值。如果由于一些奇怪的原因,它被设置为字符串,那么当你向它添加1时,它将始终返回1.
if (isset($_SESSION['views'])) {
if (!is_numeric($_SESSION['views'])) {
echo "CRAP!";
}
++$_SESSION['views'];
} else {
$_SESSION['views'] = 1;
}
答案 8 :(得分:2)
我花了很多年的时间寻找类似问题的答案。这不是代码或设置的问题,因为非常相似的代码在同一服务器上的另一个.php中完美地工作。原来这个问题是由于在此页面中将大量数据保存到会话中引起的。在一个地方我们有这样一行:$_SESSION['full_list'] = $full_list
其中$full_list
是从数据库加载的数据数组;每行是一个大约150个元素的数组。当代码最初在几年前编写时,DB只包含大约1000行,因此$full_list
包含大约100个元素,每个元素是一个包含大约20个元素的数组。随着时间的推移,20个元素变成150和1000行变成17000,因此代码将近64兆的数据存储到会话中。显然,在存储了大量数据的情况下,它拒绝存储任何其他内容。一旦我们更改了代码以在本地处理数据而不将其保存到会话中,一切都运行良好。
答案 9 :(得分:2)
如果您在php5中设置会话,然后尝试在php4页面上阅读它,它可能看起来不正确!使页面成为相同的php版本或设置session_path。
答案 10 :(得分:2)
我知道我发现的一个解决方案(OSX与Apache 1并且只是切换到PHP5)当我遇到类似问题时,取消设置1个特定键(即未设置($ _ SESSION ['key']);)导致它不是保存。一旦我没有取消该密钥,它就会保存。我再也没见过这个,除了在另一个网站上的那个服务器上,但那时它是一个不同的变量。没有什么特别的。
感谢这一个达里尔。这帮助了我。我正在删除一个会话变量,由于某种原因,它使会话保持不变。现在我只是将它设置为null(这对我的应用程序来说很好),并且它有效。
答案 11 :(得分:2)
好吧,我们可以消除代码错误,因为我在自己的服务器上测试了代码(PHP 5)。
这是检查的内容:
你在任何地方调用session_unset()或session_destroy()吗?这些函数将立即删除会话数据。如果我把这些放在脚本的末尾,它就会像你描述的那样开始表现。
它在所有浏览器中的行为是否相同?如果它在一个浏览器而不是另一个浏览器上运行,则可能在非功能浏览器上出现配置问题(即您关闭了cookie并忘记打开它们,或者错误地阻止了cookie)。
会话文件夹是否可写?您无法使用is_writable()进行测试,因此您需要转到文件夹(从phpinfo()看起来像/ var / php_sessions)并确保会话实际上已创建。
答案 12 :(得分:1)
只是想补充一点,如果您不小心错过了网页上的session_start()语句,也会发生这种情况。
答案 13 :(得分:1)
以下是我在其他评论中未提及的一个常见问题:您的主机是否正在运行某种缓存?如果他们以某种方式自动缓存结果,你会得到这种行为。
答案 14 :(得分:1)
我将会话cookie路径设置为“//”而不是“/”。萤火虫太棒了。 希望它对某人有所帮助。
答案 15 :(得分:1)
我知道我发现的一个解决方案(OSX与Apache 1并且只是切换到PHP5)当我遇到类似问题时,取消设置1个特定键(即未设置($ _ SESSION ['key']);)导致它不是保存。一旦我没有取消该密钥,它就会保存。我再也没见过这个,除了在另一个网站上的那个服务器上,但那时它是一个不同的变量。没有什么特别的。
答案 16 :(得分:1)
我在使用安全页面时出现此问题,我来自www.domain.com/auth.php,重定向到domain.com/destpage.php。我从auth.php链接中删除了www并且它有效。这让我失望,因为一切都行不通;当我到达目的地时,会议没有设定。
答案 17 :(得分:1)
经常被忽视的一个常见问题是在session_start()命令之前必须没有其他代码或额外的间距。
我之前遇到过这个问题,之前我在session_start()之前有一个空行,导致它无法正常工作。
答案 18 :(得分:1)
编辑你的php.ini 我认为session.gc_probability的值是1,所以将其设置为0。
session.gc_probability=0
答案 19 :(得分:1)
添加我的解决方案:
检查您是否访问正确的域。我正在使用www.mysite.com
启动会话,并尝试从mysite.com
(没有www
)接收会话。
我已经解决了这个问题,将所有域名的htaccess重写添加到www以保证安全/网站。
同时检查您是使用http还是https。
答案 20 :(得分:0)
检查您是否正在使用session_write_close();在任何地方,我在另一个会话之后使用这个,然后再次尝试写入会话并且它无法工作..所以只是评论sh * t out
答案 21 :(得分: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应该设置为没有cookie,会话参数必须与osc想要的一致。
您可能还需要在application_top.php中更改一些会话代码片段 - 创建tep_session_is_registered(...)调用中不存在的对象(例如导航对象),将$ HTTP_变量设置为较新的$ _SERVER对于空对象的一些和其他一些isset测试(谷歌信息)。我最终能够使用原始的sessions.php文件(包括/ classes和includes / functions)以及稍微修改过的application_top.php来重新开始。 php.ini设置是主要问题,但这当然取决于您的服务器公司安装的默认设置。