PHP会话失效

5
我已经放弃了这个问题,因为我怀疑某些设置被损坏导致了问题,并且随后创建了一个新的服务器。我认为找到问题需要花费更多的时间,而开始一个新的服务器并设置它会更快。然而,我仍然有兴趣找出是什么原因导致这种情况发生,因为它在过去三个月中一直运行得很完美,只在周末开始显示这些症状。
===============================================================================
我遇到了一点初学者的问题,可能是因为我过去几个月一直在使用其他语言工作,我似乎找不到为什么这不起作用的原因。 我制作了一个非常简单的测试脚本,如下所示:
<?php session_start();
  print_r($_SESSION);
  if(isset($_SESSION['views'])){
      $_SESSION['views'] = $_SESSION['views']+ 1;
  }
  else{
      $_SESSION['views'] = 1;
  }
  echo "views = ". $_SESSION['views'];
  echo '<p><a href="">Refresh</a></p>';

  # for testing
  var_dump($_SESSION);

?>

发生的情况是,var_dump显示创建了一个名为“views”的会话,值为1。但是当刷新页面时,没有找到活动会话,并且“views”键再次设置为1。
现在对我来说奇怪的是,在PHPSESSID下创建了一个会话ID。我已经尝试检查存储会话的路径是否可写,结果是可写的。页面返回的标头如下:
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0, public
Connection  close
Content-Encoding    gzip
Content-Length  68
Content-Type    text/html; charset=utf-8
Date    Wed, 18 Jan 2012 13:03:34 GMT
Expires Thu, 19 Nov 1981 08:52:00 GMT
Pragma  no-cache
Server  Apache
Vary    Accept-Encoding
X-UA-Compatible IE=Edge,chrome=1

在请求头中,会发送以下格式的会话 cookie:

 Cookie PHPSESSID=0e1416r7pun3pamvc7cp8mjat3

我不确定这里是否有任何问题。我正在Amazon EC2 Linux AMI上运行此程序。

我还会包括phpinfo():

PHP Version 5.3.6
System  Linux ip-**-**-**-** *.*.**.**-**.**.amzn1.x86_64 #1 SMP Sat Feb 19 23:42:04 UTC 2011 x86_64 
session
Session Support     enabled    
Registered save handlers    files user    
Registered serializer handlers  php php_binary wddx    
Directive   Local Value Master Value    
session.auto_start  Off Off
session.bug_compat_42   Off Off
session.bug_compat_warn Off Off
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly On  Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  1000    1000
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 5   5
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /var/lib/php/session    /var/lib/php/session
session.serialize_handler   php php
session.use_cookies On  On
session.use_only_cookies    On  On
session.use_trans_sid   0   0

非常感谢您的帮助,因为我一整天都在解决这个问题,但似乎找不到解决方案。如果您需要更多信息,请告诉我。

1
请确认您的会话目录可写。 - Rikesh
  1. 你能在 /tmp 目录下看到你的会话文件吗?
  2. 你使用的是哪个客户端/浏览器?
- Teson
我可以在“/var/lib/php/session”目录中以“sess_”+id的形式看到会话文件。我已经在除IE和Opera之外的所有浏览器上进行了测试,还在我的iPhone上通过WiFi和移动连接进行了测试。结果都是一样的。PS. 我刚刚尝试使用vim打开会话文件(不知道是否可能),但它是一个空文件。 - Marc Hoogvliet
请尝试此链接:https://dev59.com/b3VC5IYBdhLWcg3w4VVz - M Ram Kumar
我已经检查了所有答案,但它们似乎对我没用,我还在我的问题中使用了那个问题作为简单的示例。 - Marc Hoogvliet
3个回答

2

您需要检查php.ini文件中的session.use_cookies。

响应头没有COOKIE。

session.use_cookies必须等于1。


看起来phpinfo()显示session.use_cookies为"On" - Marc Hoogvliet
你的代码对我来说是有效的,每次刷新都会显示 $views 变量 +1。你确定你的浏览器将 COOKIE 发送回服务器了吗?! - Fabio Buda
我认为是这样的,因为刷新页面后会话ID不会改变。 - Marc Hoogvliet
抱歉,我之前误解了你的评论。顺便说一下,你的会话没问题(SessID没有改变),所以问题就像你所说的,出在保存数据的会话上(“views”)。你说会话ID文件是空的:你的问题当然是写入数据的问题。检查sessID文件是否属于Apache组,并且组可写。 - Fabio Buda
1
看起来没问题,请确保您的 Apache 组是“apache”。在某些发行版(如 Ubuntu)中,该组可能是 www-data 或 httpd。 - Fabio Buda
显示剩余5条评论

1

检查Session id是否改变(使用session_id()函数)。 此外,您可以缩短代码行:

$_SESSION['views'] = $_SESSION['views']+ 1;

使用

$_SESSION['views'] += 1;

会话 ID 保持不变。 - Marc Hoogvliet
你能看到会话路径上创建的文件吗?它们的内容是什么? - Michiel Thalen
当通过终端使用vim打开它们时,它们的内容为空。 - Marc Hoogvliet

0
当您创建指向当前页面的链接时,整个页面将不会被刷新。您需要通过JavaScript来完成这个操作。
在HTML(或PHP echo)中:
<button type='button' onclick='refreshPage()'>Refresh</button>

现在在JavaScript中设置函数:

function refreshPage(){
document.location.reload(true);
}

当JavaScript执行此操作时,整个页面将刷新,所有PHP行将重新运行。

另一种尝试的方法是链接到另一页,然后再链接回第一页,这样整个页面也会被重新加载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接