内部服务器为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和缓存没有帮助.
我相信你所做的应该有效,但是有更好的方法可以解决你的问题。不要在会话密钥前添加“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.*配置选项。
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |