同一域名下的子页面之间如何进行PHP会话管理

5
我有一个域名(domain.com),其下有多个不同的子页面,默认情况下拥有不同的会话,并且我希望其中一些子页面可以共享一个会话。
例如,我有 domain.com/section1/staff/domain.com/section2/staff/ 两个页面。我正在使用 $_SESSION 变量来存储有关当前登录用户的信息,我希望能够在 section1/staff/ 中登录一次,并在转到 section2/staff/ 时仍然保持登录状态。
从阅读其他帖子得知,这似乎是会话应该工作的默认方式,而且在两个页面中,域名未设置,路径为“ / ”,因此应该是相同的会话,但它们并没有共享$_SESSION变量,即使我调用session_destroy()也不能销毁另一个会话。
是否有一种方法可以明确地设置它们使用相同的(或者是其他需要查找的默认设置,不会在session_get_cookie_params()数组中显示)?
3个回答

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()和其他棘手的细节。而且,它解决了如何在会话之间共享某些信息(例如当前用户)的问题。

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"

?>

1
如果您正确地使用会话功能,那么同一域内的所有页面都应该可以使用默认会话设置,这是没有任何问题的。 - Mike Brant
在一个部分中,我在<?php之后的文件开头立即调用session_start(),但在另一个部分中,在加载一些变量和定义一些常量后才调用它。在此之前,页面上没有任何输出。这足以使它成为一个单独的会话吗? - Mike

0
问题在于一个部分将URL强制为domain.com,而另一个部分将其强制为www.domain.com。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接