PHP不会在某些用户的会话中存储数据

时间:2013-11-28 15:31:10

标签: php linux session

内部服务器为LAN上的用户提供两种不同的应用程序:

https://10.0.0.100/app1/
https://10.0.0.100/app2/

这两个应用程序都由相同的Apache配置文件提供服务,它们位于public_html下的不同目录中。这两个应用程序都使用PHP会话,但它们都在$_SESSION变量前面添加了名称空间:

$_SESSION['app1_favorite_colour'] = 'Yellow';
$_SESSION['app2_quest'] = 'Agghhh!';

尽管如此,登录到app1用户没有将app2_会话数据写入磁盘上的会话文件。考虑page1.php

<?php

/**
 * App2
 * /page1.php
 */

session_start();
$_SESSION['apps_been_here'] = 'Yes!';
echo "<a href='page2.php'>Clicky</a>";

?>

然后,在page2.php

<?php

/**
 * App2
 * /page2.php
 */

session_start();
echo "Have you been here: {$_SESSION['apps_been_here']}";

如果用户也登录到app1,这对用户来说打印“是”!但是,不使用app1 的用户会在page2.php上看到“是”。调查,我在/var/lib/php/session/打开了会话文件。对于登录app1 的用户,我只看到该文件中以前缀app1_开头且没有以app2_ 开头的变量。未登录到app1 的其他用户会在其会话文件中包含以app2_开头的变量!

我已与lsof核对了文件未锁定,并且我已确认浏览器中没有打开app1页面的打开浏览器窗口。 为什么App2会话变量不能存储到会话文件中?有足够的可用内存和硬盘空间,CPU负载低于0.1(由uptime测量)。多个浏览器(Firefox,Chrome)中的多个用户都会遇到这个问题。清除浏览器cookie和缓存无济于事。

3 个答案:

答案 0 :(得分:1)

我相信你所做的事情应该有效,但有一种更好的方法可以解决你的问题。 而不是在会话密钥前加上&#39; app1&#39;或者&#39; app2&#39;只需在session_start()之前使用session_name()函数,如:

session_name('app1');
session_start();
$_SESSION['been_here'] = 'Yes!';
...

您还可以使用session_set_cookie_params()调整会话Cookie路径,以便两个应用程序彼此完全不可见,如:     session_set_cookie_params(60 * 60 * 24 * 30,&#39; / app1 /&#39;);

要进一步排查故障,您应该检查使用session_ *函数的所有位置,并查看php.ini中的session.*配置选项。

答案 1 :(得分:0)

试试这个

session_start();
$_SESSION['apps_been_here'] = 'Yes!';
echo "<a href='page2.php'>Clicky</a>";
session_write_close();

我曾经遇到过这样的问题。那为我修好了!

答案 2 :(得分:0)

不好,他们必须在同一个子树中 你需要

  • 根/
    • 的myapp /
      • session.php文件
      • APP1 /
      • APP2 /

session.php将仅包含session_start();

每个app1&amp; app2将包含session.php(require_once(“../ session.php”);) 这是我知道让他们工作的唯一方法