【问题标题】:PHP: Alternative to SESSIONSPHP:会话的替代品
【发布时间】:2011-05-29 07:32:00
【问题描述】:

我有一个非常依赖会话变量的 PHP 应用程序。登录后,用户会被重定向到一个页面,该页面执行代码以根据用户是谁设置会话变量的负载。应用程序使用来自不同来源的数据,会话用于存储 ID 号以查询数据库。

因此,当用户访问将查询其资产管理系统的页面时,他们的特定数据库 ID 会通过会话调用。

我最近遇到了很多关于会话变量的问题。有时在应用程序的生命周期中只创建一个会话文件,有时每个会话请求都会产生一个新的会话 ID(仍然没有设法找出原因!)。

我的问题是这样的。有没有替代使用会话变量的方法?喜欢全局变量还是其他方式?

我在这里有一个关于我的会话问题的问题 - PHP session variables not being maintaned

【问题讨论】:

  • 我看到的一点在这里没有提到...如果您最近安装了任何依赖 symphony 的组件并且它的“会话管理”系统被包括在内,那么很可能这就是您的问题的根源.

标签: php global-variables session-variables tempdata


【解决方案1】:

对于在每次请求时重新创建的会话,您应该尝试调试服务器发送给您的 cookie。 在这些 cookie 中检查 cookie 域是否正确(并检查 cookie 路径)。

要调试 cookie,您可以使用 Web 开发人员工具栏来显示页面加载后哪些 cookie 处于活动状态。但最好的工具是 Live Http 标头,检查服务器发送的真实标头,在那里你会找到真正的 cookie 内容,如果 cookie 域不匹配(例如——但大多数时候是这样)你的浏览器不会为您的网站存储此 cookie。

如果您的浏览器忽略 cookie,则您请求的下一页 PHP 会构建另一个会话,等等。

如果您无法让您的 cookie 系统正常工作,您可以跟踪 PHP 中跟踪会话 ID 的旧方法,该方法使用带有 PHPSESSID 的永久 get 和/或 post 参数。 你的 PHP 编译需要 --enable-rans-id(在 phpinfo 页面上查看)http://www.php.net/manual/en/session.idpassing.php

【讨论】:

    【解决方案2】:

    Cookies 并不是真正的替代品,特别是在用于登录时,因为它们可以由用户更改,而对于会话,只在他们的计算机上存储一个包含识别哈希的 cookie,修改它不会得到它们很远。

    无论如何,会话工作。毫无疑问,您的问题是实施问题。我建议您花一些时间进行调试和测试,因为实现替代方法会导致代码异常复杂 - 您不想这样做,因为会话已经给您带来了麻烦。

    【讨论】:

      【解决方案3】:

      会话似乎是解决此问题的正确方法。 通常会话是这样工作的: 在服务器上创建一个会话对象并分配一个 id。 id 以 cookie 的形式发送到浏览器,并随浏览器的请求发送到服务器,从而使服务器能够从内存中获取正确的会话对象。

      您可能想看看您的会话是如何配置的。如果您一直“丢失”会话,一个可能的原因可能是您在子域之间“跳跃”并且只为一个子域设置了会话 cookie。另一个原因可能是您的会话过期时间太短。

      【讨论】:

      【解决方案4】:

      您可以使用其他一些“会话”解决方案,但这需要您做更多的工作。

      例如,您可以使用基于 url 的会话,其中站点生成的每个 url 都包含一个 sessionid。这通常是对网站的重大重新设计,唯一需要的是,如果您需要在多个域上进行相同的会话,或者如果您希望同一台计算机在浏览器的不同窗口中运行不同的会话。

      但在您的情况下,我会检查会话中断的原因,这可能是配置问题,或者您有其他问题会破坏会话文件。

      PHP 会话我从来没有遇到过任何问题,它们可以正常工作;)

      【讨论】:

        【解决方案5】:

        另一种选择是将会话数据存储在数据库中,为用户提供带有 session_id 的 cookie。这将使您能够更好地控制会话。

        【讨论】:

        • 这听起来不错,但我遇到了一个问题,即为每个会话请求生成一个新的会话 ID。因此,如果我给他们一个会话 ID,它很可能会更改或被覆盖
        • 其实是cookie问题。在一个页面上创建一个cookie,导航到另一个页面,cookie就消失了
        • 这... ...这就是会话通常的工作方式,服务器只存储由 php 自动生成的特定会话令牌。所以请注意,从这个角度来看,没有任何收获。
        • @Kzqai,是的,逻辑上是一样的,但是通过将会话和会话数据保存在可控和可扩展的位置,您可以完全控制会话管理。
        【解决方案6】:

        不,因为每个用户会话都应该有一个值,所以您需要某种会话机制。而 PHP 的 session 就可以做到这一点。您可能只需要正确配置它即可满足您的需求。

        【讨论】:

          【解决方案7】:

          会话的替代方案是 cookie(实际上,会话通常使用 cookie 实现)。但仅当您想存储 少量 数据时才应使用 Cookie。

          【讨论】:

            猜你喜欢
            • 2011-12-08
            • 2023-03-15
            • 2011-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-17
            • 2017-11-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多