PHP没有为某些用户在会话中存储数据


PHP not storing data in sessions for some users

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

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,则不会向用户打印"yes"!但是,不使用app1的用户会page2.php上看到"是"。经过调查,我打开了/var/lib/php/session/中的会话文件。我在该文件中只看到以前缀app1_开头的变量,对于登录到app1的用户,没有看到以app2_开头的变量。其他未登录app1的用户的会话文件中有以app2_开头的变量!

我已与lsof核实文件未锁定,并确认浏览器中没有打开的运行app1页面的浏览器窗口为什么App2会话变量不能存储到会话文件中有充足的可用内存和硬盘空间,CPU负载低于0.1(通过uptime测量)。这个问题发生在多个浏览器(Firefox、Chrome)中的多个用户身上。清除浏览器cookie和缓存没有帮助。

我相信你所做的应该有效,但有更好的方法可以解决你的问题。不要在会话密钥前加上"app1"或"app2",只需在session_start()之前使用session_name()函数,如:

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

您还可以使用session_set_cookie_params()调整会话cookie路径,使两个应用程序彼此完全不可见,如下所示:session_set_kokie_params(60*60*24*30,'/ap1/');

为了进行进一步的故障排除,您应该检查所有使用session_*函数的地方,并查看php.ini中的session.*config选项。

试试这个

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

我曾经遇到过这样的问题。那帮我搞定了!

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

  • 根/
    • myapp/
      • session.php
      • app1/
      • app2/

session.php将只包含session_start();

每个app1&app2将包括session.php(requireonce("../session.php");)这是我所知道的使它们工作的唯一方法