我有一个域(domain.com),其中有多个子页面具有不同的会话(默认情况下),我希望其中一些子页面能够共享会话。
例如,我有domain.com/section1/staff/
和domain.com/section2/staff/
。
我使用$_SESSION
变量来存储当前登录用户的信息,我希望能够在section1/staff/
中登录一次,并在我转到section2/staff/
时仍然登录。
从阅读other postings看来,这似乎是会话应该工作的默认方式,并且在两个页面中都没有设置域,而session_get_cookie_params()
中的路径是“/”所以它应该是相同的会话,但它不共享$_SESSION
变量,即使我调用session_destroy()
它也不会破坏其他会话。
有没有办法明确地将它们设置为使用相同的(或其他地方来查找不会出现在session_get_cookie_params()
数组中的默认设置)?
答案 0 :(得分:4)
默认情况下,PHP将对同一域中的所有脚本使用相同的会话。请注意domain.com和www.domain.com之间的互动,因为他们可能没有相同的会话。
为什么不为每个部分创建完全独立的会话,为什么不为用户和部分使用单个全局会话? $ _SESSION没有理由不能成为多维数组。
//// things needed in multiple sections could go into a common grouping:
$_SESSION['common']['user'] = 'josh';
$_SESSION['common']['privileges']['section_access'] = array( 'section1'=>"yes", 'section2'=>"no", 'section5'=>"security-prompt" );
//// while things that were section specific could be grouped by section:
$_SESSION['section1']['agreed_to_terms'] = true;
//// you could also group by logical functionality:
$_SESSION['staff']['badge_no'] = 44815;
使用这种结构,您可以在每个脚本中获得所有可用信息,但只能使用您需要的部分。
此外,这可以节省您在逻辑中处理session_name()和其他棘手位的麻烦。另外,这解决了如何在会话之间共享一些信息(例如当前用户)的问题。
答案 1 :(得分:0)
处理$_SESSION
时的通常建议是确保在所有PHP脚本的顶部调用session_start();,而不是其他任何内容。
示例:
<?php // file1.php
session_start();
// other stuff...
$_SESSION['user'] = 'josh';
?>
<?php // file2.php
session_start();
// other stuff...
echo $_SESSION['user']; // should print "josh"
?>
答案 2 :(得分:0)
问题在于,一个部分强制URL到domain.com,另一部分强制它到www.domain.com。