PHP:替代SESSION的方法

3
我有一个依赖于会话变量的PHP应用程序。登录后,用户被重定向到一个页面,执行代码设置一系列会话变量,具体取决于用户是谁。该应用程序使用来自不同来源的数据,并且会话用于存储ID号以查询数据库。
因此,当用户访问将查询其资产管理系统的页面时,会话调用该特定数据库的ID。
最近,我遇到了很多与会话变量相关的问题。有时仅在应用程序的生命周期内创建一个会话文件,有时每个会话请求都会导致新的会话ID(仍然没有找出原因!)。
我的问题是这样的。有没有其他方法可以替代使用会话变量?像全局变量或其他方式?
关于我的会话问题,我有一个问题打开在这里 - PHP session variables not being maintaned

这里有一个我发现没有提到的问题...如果你最近安装了任何依赖于symphony和它的“会话管理”系统的组件,那么很可能这就是你问题的根源。 - lilHar
7个回答

4

另一个选择是将会话数据存储在数据库中,并为用户提供带有您的session_id的cookie。这将使您对会话拥有更多的控制。


这听起来不错,但我遇到了一个问题,每次会话请求都会生成一个新的会话 ID。因此,如果我给他们一个会话 ID,很可能会被更改或覆盖。 - iamjonesy
实际上这是一个cookie问题。在一个页面上创建一个cookie,导航到另一个页面时cookie就消失了。 - iamjonesy
这... ...通常情况下,会话的工作方式就是这样,服务器只是存储由PHP自动生成的特定会话令牌。因此,请注意从这个角度来看,实际上并没有获得任何东西。 - Kzqai
@Kzqai,逻辑上是相同的,但是通过将会话和会话数据保存在可控且可扩展的位置,您可以完全掌控会话管理。 - Māris Kiseļovs

2
不需要,因为每个用户会话都应该有其自己的值,所以你需要某种会话机制。PHP的会话适合这种情况。您可能只需要正确配置它以满足您的需求。

2
您可以使用其他“会话”解决方案,但这需要您做更多的管道工作。
例如,您可以使用基于url的会话,其中网站生成的每个url都包括一个sessionid。这通常是站点的重大重新设计,唯一需要的时间是如果您需要在多个域上具有相同的会话,或者如果您喜欢在浏览器的不同窗口中运行不同的会话。
但在您的情况下,我建议检查为什么会话已经中断,这可能是配置问题,或者您有其他东西损坏了会话文件。
我从未遇到过PHP会话的任何问题,它们只是工作的 :)

1

替代会话的方法是使用 cookie(事实上,通常使用 cookie 实现会话)。但是只有在您想要存储 量数据时才应该使用 cookie。


0

对于这个问题,会话似乎是正确的解决方案。 通常情况下,会话的工作方式如下: 在服务器上创建一个会话对象并分配一个ID。将该ID作为cookie发送到浏览器,并随着浏览器请求发送到服务器,从而使服务器能够从内存中获取正确的会话对象。

您可能需要查看会话的配置方式。如果您不断“丢失”会话,可能的原因之一是您在子域之间“跳转”,并且会话cookie仅设置为一个子域。另一个原因可能是您的会话过期时间太短。


谢谢回复,我有一个关于会话问题的问题在这里打开 - https://dev59.com/FlLTa4cB1Zd3GeqPaGrA - iamjonesy

0

Cookie并不是一个真正的替代品,特别是在用于登录时,因为用户可以更改它们,而对于会话只需在计算机上存储包含标识哈希的cookie,修改它们将无济于事。

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


0

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

要调试 cookie,可以使用 Web 开发人员工具栏来显示页面加载后活动的 cookie。但是最好的工具是 Live Http headers,检查服务器发送的真实标头,在那里您将找到真正的 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


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