内部服务器为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和缓存无济于事。
答案 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)
不好,他们必须在同一个子树中 你需要
session.php将仅包含session_start();
每个app1&amp; app2将包含session.php(require_once(“../ session.php”);) 这是我知道让他们工作的唯一方法