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

dot*_*hen 6 php linux session

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

https://10.0.0.100/app1/
https://10.0.0.100/app2/
Run Code Online (Sandbox Code Playgroud)

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

$_SESSION['app1_favorite_colour'] = 'Yellow';
$_SESSION['app2_quest'] = 'Agghhh!';
Run Code Online (Sandbox Code Playgroud)

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

<?php

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

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

?>
Run Code Online (Sandbox Code Playgroud)

然后,在page2.php:

<?php

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

session_start();
echo "Have you been here: {$_SESSION['apps_been_here']}";
Run Code Online (Sandbox Code Playgroud)

如果用户也登录到app1,则不会向用户显示"是"!但是,不使用app1的用户确实看到"是" page2.php.调查,我打开了会话文件/var/lib/php/session/.我只看到该文件中以前缀开头的变量,app1_而没有以app2_ 登录到app1的用户开头的变量.未登录app1的其他用户确实拥有app2_会话文件中的变量!

我已经检查lsof过文件没有被锁定,我已经确认浏览器中没有打开的浏览器窗口运行app1页面.为什么App2会话变量不能存储到会话文件中?有足够的可用内存和硬盘空间,CPU负载低于0.1(测量值uptime).多个浏览器(Firefox,Chrome)中的多个用户都会遇到这个问题.清除浏览器cookie和缓存没有帮助.

Dav*_*one 1

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

session_name('app1');
session_start();
$_SESSION['been_here'] = 'Yes!';
...
Run Code Online (Sandbox Code Playgroud)

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

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