什么是 PHP session_start()?

24
它基于Cookie启动当前会话吗?我从PHP网站得到了这个信息。PHP如何控制会话?如果我在用户打开我的登录页面时启动一个会话,那么我该如何使用该会话?我可以使用当前会话获取有关已登录用户的信息吗?
5个回答

24

PHP会话系统允许您在$_SESSION全局数组中安全地存储数据。一个典型的例子是当用户输入密码时,在会话中存储用户标识符:

if ($user = try_login($login, $password)) 
  $_SESSION['user'] = $user;

然后,您可以在所有其他页面上访问该信息:

if (isset($_SESSION['user']))
  // logged in !
  echo user_name($_SESSION['user']);

数据存储在服务器上,因此不存在被篡改的风险(另一方面,注意磁盘使用情况)。

启动会话允许当前请求使用$_SESSION。如果这是用户的第一次访问,则数组将为空,并为您发送一个新的会话cookie。

关闭会话仅防止当前请求使用$_SESSION,但数据会留存在下一个请求中。

销毁会话永久删除所有数据。会话在最后一次访问后的一定时间内被销毁(通常约为30分钟)。


哦,好的。所以它是一个空的全局数组,你可以用它来存储用户值(或其他值),以维护他们在网站中的独特体验。 - Scott
我知道这已经很老了,但是关闭会话,即执行session_write_close(),只会关闭存储会话的文件。您仍然可以访问全局变量$_SESSION。事实上,$_SESSION甚至不受session_destroy()的影响,后者只会删除会话文件中的数据。 - user11766741

12

我猜你想知道PHP会话对程序员意味着什么。

当你执行session_start()时,你告诉PHP你想使用会话。这将以一个名为$_SESSION的数组形式提供给你。你可以像使用其他数组一样使用它,不同之处在于你放在里面的东西会从一个页面保留到另一个页面(前提是你在每个页面开头使用session_start())。

实际的机制可能因配置(php.ini)而异,但典型的安装可以使用cookie进行会话。假设你的Web服务器在Linux上并且你正在使用cookie,则可以执行以下操作:

session_start();
$_SESSION['name']='Bob';

当PHP看到这个时,它会创建一个半随机命名的文本文件(例如sess_a3tfkd5558kf5rlm44i538fj07),将$_SESSION内容以纯文本形式放在其中,然后向用户发送一个带有会话ID的cookie,该ID可用于找到会话文件(例如a3tfkd5558kf5rlm44i538fj07)。

下次用户回来时,他将在cookie中提交会话ID,PHP将访问相应的文件并加载其内容到$_SESSION中。

你会注意到实际信息被保留在服务器上,而用户只获得一个ID。就像在俱乐部交换外套并获得一个带有号码的票一样。


如果我每个页面都开始一个会话,PHP如何知道如何从上一页保留$SESSION变量中的相同信息呢?使用Cookie吗? - Scott
1
@Scott - 如果用户有一个带有与现有会话匹配的会话ID的cookie(现有会话文件),session_start()将恢复会话。否则,它将启动一个新会话。 - Manos Dilaverakis
我已经阅读了有关会话的PHP文档,但是我找不到会话实际cookie设置的位置。当我第一次运行会话时,我可以看到响应包含一个带有SID的set-Cookie头。请求后也将SID值持久化在Cookie中。我的问题是,标头在哪里分配SID。这是否在调用session_start()之后内部发生,并且是否有查看代码的方法? - Cesar Perez
@CezarPerez 抱歉,我不认为我能回答那个问题,因为我已经近十年没有仔细研究过会话了。 - Manos Dilaverakis

4
PHP的session_start函数开始或恢复一个HTTP会话,这在这篇文章中已经解释得很好了:http://en.wikipedia.org/wiki/Session_(computer_science)
HTTP“会话”的概念不仅适用于PHP,它也被许多(所有?)服务器端HTTP框架用作一种方式,允许在不同的请求/响应之间存储/关联某些状态(因为HTTP是无状态的)。一个唯一的标记(通常但并非总是存储在cookie中)标识特定的客户端,并且服务器可以关联“会话”。
以下是有关会话和特别是PHP的更多信息,可能会有所帮助:http://www.php.net/manual/en/book.session.php

3

正如手册中所述

session_start()会基于通过GET或POST请求传递的会话标识符或通过cookie传递的标识符创建一个会话或恢复当前会话。

如果您在登录页面开始新会话,则该会话最初为空。您可以将任何想要存储的内容存储在其中,例如,在用户登录后存储用户ID。会话数据在关闭会话时被销毁。

您可能希望阅读会话扩展手册页中的所有章节,并查看


2
您可以将PHP会话与cookie进行比较,但会话是存储信息的更安全的方式。Cookie将数据存储在用户计算机上,而会话则在服务器上以临时文件的形式安全存储。 我在我的博客文章中讨论了会话及其使用方法 - 如何开始PHP会话,存储和访问会话数据? 以下是在PHP会话中存储数据的示例代码:
<?php
session_start();
$_SESSION["name"] = "John";
?>

以下是检索会话数据的示例:
<?php
session_start();
echo $_SESSION["name"];
?>

上述代码将显示名称为“John”。
来源:如何启动PHP会话,存储和访问会话数据?

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