3

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

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

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

我的问题是这个。有没有替代使用会话变量的方法?像全局变量或其他方式?

我在这里有一个关于我的会话问题的问题 - PHP 会话变量没有被维护

4

7 回答 7

4

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

于 2010-12-22T09:43:48.387 回答
2

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

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

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

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

于 2010-12-22T09:44:48.990 回答
2

不,由于每个用户会话都应该有其一个值,因此您需要某种会话机制。而 PHP 的会话对此很好。您可能只需要正确配置它即可满足您的需求。

于 2010-12-22T09:40:14.513 回答
1

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

于 2010-12-22T09:37:54.890 回答
0

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

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

于 2010-12-22T09:47:36.750 回答
0

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

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

于 2010-12-22T09:51:24.390 回答
0

对于在每次请求时重新创建的会话,您应该尝试调试服务器发送给您的 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

于 2010-12-22T09:55:30.610 回答