【问题标题】:What is the difference between Sessions and Cookies in PHP?PHP 中的会话和 Cookie 有什么区别?
【发布时间】:2011-09-14 10:48:21
【问题描述】:

PHP中的SessionsCookies有什么区别?

【问题讨论】:

  • 我们是否同意问题和答案都与语言无关且不特定于 PHP?如果是这样,不应该编辑问题吗?

标签: php session cookies session-state session-cookies


【解决方案1】:

cookie 是浏览器存储的一些数据,并随每个请求发送到服务器。

会话是存储在服务器上并与给定用户关联的数据集合(通常通过包含 id 代码的 cookie)

【讨论】:

  • @Quentin:) cookie 也可以存储在会话中?
  • 连接关闭后会话值也会被重置。 Cookie 值通常会被保存。
  • @poter — 如果一条数据存储在服务器上,那么浏览器就不会存储它(数据副本不存在),所以不,你不能存储 cookie在一个会话中。
  • @BadSkillz — 没有。会话值通常在经过一段时间后与会话相关联的客户端没有连接后重置。 Cookie 值会一直保存到它们的到期时间(或者如果未设置浏览器则关闭浏览器)。立即过期覆盖适用于两者。
  • @Quentin:) 但是当我们再次打开浏览器时,它仍然保留保存的 cookie
【解决方案2】:

会话是在服务器上维护的一块数据,用于维护 HTTP 请求之间的状态。 HTTP 本质上是一个无状态协议;会话用于赋予它有状态。

cookie 是发送到客户端和从客户端返回的数据的 sn-p。 Cookie 通常用于促进会话,因为它告诉服务器哪个客户端处理了哪个会话。还有其他方法可以做到这一点(查询字符串魔术等),但 cookie 可能是最常见的。

【讨论】:

  • 我丢失了会话信息,你可以告诉我为什么最好的方法是解决这个问题?请阅读我对@toomasr 解决方案的评论
【解决方案3】:

Cookies 用于识别会话。访问任何使用 cookie 的网站,然后调出 Chrome 检查元素,然后调出网络或 FireBug(如果使用 Firefox)。

您可以看到有一个标头发送到服务器并接收到称为Cookie。通常它包含一些可以在服务器上用于识别会话的个人信息(如 ID)。这些 cookie 保留在您的计算机上,您的浏览器负责将它们仅发送到使用它识别的域。

如果没有 cookie,那么您将通过 GET 或 POST 在每个请求上发送一个唯一 ID。 Cookie 就像在您的计算机上保留一段时间的静态 ID。

会话是服务器上与 cookie 信息相关联的一组信息。如果您使用的是 PHP,您可以检查 session.save_path 位置并实际“查看会话”。它们要么是服务器文件系统上的文件,要么是数据库中的文件。

【讨论】:

  • 指向 firebug 和 chrome 开发工具的附加点。
  • 我丢失了有关会话的信息并且 cookie 处于活动状态,这导致应用程序出错,为什么保持会话的最佳方式是?我将数据存储在会话中,但 laravel maintan 用户通过 cookie 登录并且会话数据消失了。我能做什么或读什么?
  • (通过 Laravel 框架,这是我的麻烦)
  • 会话与将内容存储在数据库中不同吗?
  • 大多数时候,开箱即用的会话数据存储在磁盘的某个位置。因此,对于 Apache 和 PHP,它存储在系统临时文件夹中,或者您可以将其配置为存储在其他位置。即使在数据库中!
【解决方案4】:

会话和 cookie 的主要区别在于会话数据存储在服务器上,而 cookie 将数据存储在访问者的浏览器中。

会话比 cookie 更安全,因为它存储在服务器中。可以从浏览器关闭 Cookie。

存储在 cookie 中的数据可以存储数月或数年,具体取决于 cookie 的寿命。但是当浏览器关闭时会话中的数据会丢失。

【讨论】:

    【解决方案5】:

    Cookies以文本文件格式存储在浏览器中。它存储的数据量有限,最多4kb[4096bytes]。单个Cookie不能保存多个值但是是的,我们可以拥有多个 cookie。

    Cookie 易于访问,因此它们安全性较低。 setcookie() 函数必须出现在标签之前

    会话存储在服务器端。会话没有这样的存储限制。会话可以保存多个变量。由于它们不易访问,因此比 cookie 更安全。

    【讨论】:

      【解决方案6】:

      会话

      会话用于维护服务器和用户之间的对话。 它更安全,因为它存储在服务器上,我们不能轻易访问它。 它在用户计算机上嵌入 cookie。它存储无限数据。

      Cookies

      Cookie 存储在本地计算机上。基本上,它维护用户标识,这意味着它跟踪访问者记录。它不如会话安全。 它存储有限数量的数据,并在有限的时间内维护。

      【讨论】:

        【解决方案7】:

        所有这些解释中缺少的一个部分是 Cookie 和会话如何链接 - 通过 SessionID cookie。 Cookie 在客户端和服务器之间来回传输 - 服务器通过 cookie 的会话 ID 部分链接用户(及其会话)。 您也可以通过 url 发送 SessionID(不是最佳实践) - 以防客户端禁用 cookie。

        我做对了吗?

        【讨论】:

          【解决方案8】:

          Cookie

          • 是保存在浏览器(客户端)中的少量数据

          • 可以用setcookie从PHP中设置,然后发送到客户端的浏览器(HTTP响应头Set-cookie

          • 可以直接在Javascript客户端设置:document.cookie = 'foo=bar';

          • 如果没有设置过期时间,默认在关闭浏览器时过期。
            示例:继续http://example.com,打开控制台,执行document.cookie = 'foo=bar';。关闭选项卡,重新打开同一个网站,打开控制台,执行document.cookie:你会看到foo=bar 仍然存在。现在关闭浏览器并重新打开它,重新访问同一个网站,打开控制台;你会看到document.cookie 是空的。

          • 您还可以设置一个精确的过期日期,而不是“关闭浏览器时删除”。

          • 存储在浏览器中的 cookie 在同一网站的每个请求的标头中发送到服务器(请参阅Cookie)。例如,您可以通过打开 开发者工具 > 网络,在 Chrome 中看到这一点,点击请求,查看 Headers

          • 可以用document.cookie在客户端读取

          • 可以用$_COOKIE['foo']在服务器端读取

          • 奖励:它也可以使用 PHP 以外的其他语言设置/获取。带有“瓶子”微框架 (see also here) 的 Python 示例:

            from bottle import get, run, request, response
            @get('/')
            def index():
                if request.get_cookie("visited"):
                    return "Welcome back! Nice to see you again"
                else:
                    response.set_cookie("visited", "yes")
                    return "Hello there! Nice to meet you"
            run(host='localhost', port=8080, debug=True, reloader=True)
            

          会话

          • 是一些与浏览器会话相关的数据保存在服务器端

          • 每种服务器端语言可能以不同的方式实现它

          • 在 PHP 中,当 session_start(); 被调用时:

            • 服务器会生成一个随机 ID,例如jo96fme9ko0f85cdglb3hl6ah6
            • 一个文件保存在服务器上,包含数据:例如/var/lib/php5/sess_jo96fme9ko0f85cdglb3hl6ah6
            • 会话 ID 在 HTTP 响应标头中发送到客户端,使用上面详述的传统 cookie 机制Set-Cookie: PHPSESSID=jo96fme9ko0f85cdglb3hl6ah6; path=/:

              (也可以通过 URL 而非 cookie 发送,但不是默认行为)

            • 您可以使用document.cookie 在客户端查看会话 ID:

          • PHPSESSID cookie 设置为没有过期日期,因此它会在浏览器关闭时过期。因此,当浏览器关闭/重新打开时,“会话”不再有效。

          • 可以用$_SESSION在PHP中设置/读取

          • 客户端看不到会话数据,只看到 ID:在index.php 中执行此操作:

            <?php
            session_start();
            $_SESSION["abc"]="def";
            ?>
            

            在客户端看到的唯一内容是(如上所述)会话 ID:

          • 因此,会话对于存储您不希望客户端看到或修改的数据很有用

          • 如果您想使用自己的数据库 + ID 并使用传统 Cookie 向客户端发送 ID/令牌,则可以完全避免使用会话

          【讨论】:

          • 完美解释
          • 我见过的关于cookie和会话的最清楚的答案,尤其是关闭浏览器后如何自动删除会话。
          • 这必须是公认的答案。
          猜你喜欢
          • 2011-05-27
          • 2011-07-04
          • 2012-12-30
          • 1970-01-01
          • 2023-02-10
          • 1970-01-01
          • 2018-08-05
          • 2010-09-26
          • 2011-09-17
          相关资源
          最近更新 更多