技术开发 频道

PHP 开发经典教程 (Part 4):会话管理

记住我

这里是另外一个例子,该例子要求你登录然后存储你的登录名称和session起始时间作为两个session变量。然后这个信息被用于显示该session处于活跃期的完整时间。
<?php // initialize a session session_start(); ?> <html> <head></head> <body> <?php if (!isset($_SESSION['name']) && !isset($_POST['name'])) { // if no data, print the form ?> <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post"> <input type="text" name="name"> <input type="submit" name="submit" value="Enter your name"> </form> <?php } else if (!isset($_SESSION['name']) && isset($_POST['name'])) { // if a session does not exist but the form has been submitted // check to see if the form has all required values // create a new session if (!empty($_POST['name'])) { $_SESSION['name'] = $_POST['name']; $_SESSION['start'] = time(); echo "Welcome, " . $_POST['name'] . ". A new session has been activated for you. Click <a href=" . $_SERVER['PHP_SELF'] . ">here</a> to refresh the page."; } else { echo "ERROR: Please enter your name!"; } } else if (isset($_SESSION['name'])) { // if a previous session exists // calculate elapsed time since session start and now echo "Welcome back, " . $_SESSION['name'] . ". This session was activated " . round((time() - $_SESSION['start']) / 60) . " minute(s) ago. Click <a href=" . $_SERVER['PHP_SELF'] . ">here</a> to refresh the page."; } ?> </body> </html>
在该例子中,一个session变量的存在与否用于决定显示三个可能的屏幕中的那一个。session起始时间用返回1970年1月1日和当前时间之间的总秒数的time()函数记录于$_SESSION['start']中。在稍后阶段,存储于$_SESSION['start']的值和最近的time()值比较以计算和显示一个(大约的)耗时展示。

对session_start()函数的调用必须在脚本生成的任意输出(假定你没有使用PHP的输出缓冲特征,你可以在http://www.php.net/manual/en/ref.outcontrol.php中阅读关于输出缓冲的信息)之前首先出现,注意到这一点是重要的。这是因为PHP session处理器内部使用内存cookies以存储session数据,而且cookie创建头必须在任意输出之前传输给客户端浏览器。

如果你曾经在你的session激活的页面中看到过类似下面的错误:
Warning: Cannot send session cache limiter - headers already sent (output started at ...)
该错误通常是因为在session_start()被调用之前在某处,不知何故的,一些输出到达了浏览器。甚至在围绕session_start()函数的PHP标签之外的一个回车或者空格都可以引发这个错误,因此,请密切注意它们。

和之前说明的一样,每个session都有一个唯一的sessionID,PHP使用该sessionID跟踪不同的客户端。这个sessionID是一个长的字符与数字混合的字符串,该字符串被PHP自动地在页面之间传递以使得session的连续性得以保持。为了看它是什么样子的,请使用session_id()函数,就像下面这个例子中一样:
<?php // initialize a session session_start(); // print session ID echo "I'm tracking you with session ID " . session_id(); ?>
当用户关闭客户端浏览器和销毁session时,$_SESSION数组会被冲掉所有的session变量。你也可以通过调用session_destroy()函数明确的销毁一个session(比如,当用户退出的时候),就像下列例子一样:
<?php // initialize a session session_start(); // then destroy it session_destroy(); ?>
倘若你想知道你读的是否正确,那么是的,在你调用session_destroy()来销毁一个session之前,你必须首先调用session_start()来重新创造它。

请记住,$_SESSION是一个超全局变量,因此你在函数内外均可以使用它而不需要首先将其声明为全局变量。下列例子详细解释了这一点:
<?php // initialize a session session_start(); // this function checks the value of a session variable // and returns true or false function isAdmin() { if ($_SESSION['name'] == 'admin') { return true; } else { return false; } } // set a value for $_SESSION['name'] $_SESSION['name'] = "guessme"; // call a function which uses a session variable // returns false here echo isAdmin()."<br />"; // set a new value for $_SESSION['name'] $_SESSION['name'] = "admin"; // call a function which uses a session variable // returns true here echo isAdmin()."<br />"; ?>
你可以在http://www.php.net/manual/en/ref.session.php中阅读更多的关于session和session处理函数的内容。
0
相关文章