内部服务器为局域网上的用户提供两种不同的应用程序:
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");)这是我所知道的使它们工作的唯一方法