【问题标题】:PHP Session is lost on smartphones when returning to browser [duplicate]返回浏览器时,智能手机上的 PHP 会话丢失 [重复]
【发布时间】:2021-07-21 01:27:10
【问题描述】:

我有一个包含以下阶段的结帐流程:

  1. 价格结果
  2. 客户详情
  3. 付款
  4. 订单确认

我使用 PHP 会话变量来存储信息,并在用户继续购买时检查这些会话变量是否存在于整个购买过程中。我还有一些代码可以阻止用户直接点击客户、付款或订单确认页面,因为这意味着他们没有在结果页面上获得报价,也没有设置相关的会话变量。

问题:

似乎在平板电脑和智能手机上获得报价的用户正在与其他网站进行大量价格比较,并在标签页中打开我们的网站。但此类设备的行为与桌面浏览器不同。

如果您打开一个选项卡然后转到另一个应用程序,或加载许多其他网页,当您尝试返回上一个选项卡时,设备似乎会:

  • 以您离开时的状态加载页面,或者
  • 将重新加载标签 URL,就好像它是对页面的新点击一样。

还有问题。如果有人在我的客户页面或付款页面上,并且 URL 获得了新的点击,则会话似乎不存在并且我的代码认为有人是第一次点击该页面,这会向我的客户抛出一条友好的错误消息说请重新开始他们的报价。

我的系统设计是否糟糕?有人对我如何解决这个问题有任何建议吗?我真的需要一种方法来让客户坐在客户详细信息或付款阶段,也许几个小时,然后能够完成购买过程。

我应该使用会话、cookie 和数据库 - 还是组合使用?

【问题讨论】:

  • 您是否在会话处理中记录或处理与客户 IP 相关的任何事情?如果您是,那么这可能是问题,因为客户可能在移动数据和无线之间漫游。或者,如果他们打开了许多页面并稍后返回您的页面,则会话可能只是过期。您有两个解决方案:让您的会话及时过期,或者您可以使用 cookie 让浏览器保存其状态,而不是依赖服务器...
  • 增加会话超时。这是唯一的方法。或者让他们在后台关闭打开的应用程序。这不是这样做的方法。但是你不能对刷新做任何事情:只有用户。
  • 我们将 session.gc_maxlifetime 设置为 86400 作为测试,看看 24 小时是否足够长。但是我们仍然会丢失会话并查看服务器变量,我可以看到这都是移动/平板电脑流量。我意识到这是由于此类设备上的浏览器是如何运行的。不活动后重新加载 URL。我想我需要在这里使用一个或多个 cookie,不是吗。但是如果我保存了 50-80 个信息会话变量,这仍然可行吗?
  • 如果现有会话丢失,您能否重新启动它?因此,如果用户重新加载客户 URL,您是否可以将会话 ID 保存在 cookie 中,然后从中重新加载会话? IE。服务器是否还有信息,只是没有与用户的连接?这就是cookie可以提供帮助的地方吗?我在这里有点困惑......

标签: php session cookies session-variables session-cookies


【解决方案1】:

只有使用 cookie 才能可靠地解决您的问题。 PHP 可以将其会话变量存储在 cookie 中,并通过会话 cookie 的值在内部读取所有相关的会话参数。

因此,您获得的不是 URL 会话,而是 cookie 会话。

只需在每个 php 文件的顶部使用 session_start(),或者如果您有一个总是首先加载的主对象(例如 index.php),请将 session_start() 放在那里。

【讨论】:

  • 今天下午我会好好阅读一下,如果没问题,我会在这里回复您。感谢分享。
  • 嗨,迈克尔。因此,经过更多阅读,平板电脑和手机的问题是“标签丢弃” - 操作系统将删除标签缓存并仅存储 URL,准备在您再次需要时重新加载整个网页。现在这似乎像预期的那样扼杀了我的会话。但是,如果我从一开始就将 session_id() 存储在 cookie 中 - 当页面加载并开始使用该会话时,我是否可以不读取此值,因此客户会继续,就好像会话从未结束一样?我确实阅读了上面的链接,但尚不清楚这是否能解决我的问题。希望你能帮忙!提前致谢。
  • 如果它存储在 cookie 中,按照 php 的默认设置,它应该在页面请求时请求 cookie 并重新初始化会话。您确定您的 php 配置为允许会话 cookie 吗?另外,尝试做一个 var_dump($_COOKIE);并在知道 PHPSESSID cookie 已设置后查看它是否存在(第二个页面加载,会话处于活动状态)。要排除浏览器,只需丢弃所有会话数据,因为会话 cookie 将在浏览器确定会话过期后过期。要解决这个问题,您需要摆弄会话参数或使用自定义会话 cookie 和会话存储(数据库)
  • 嗨,Michael - 您可以使用 Skype 即时消息或电子邮件吗?我很想向您展示我们的系统,但在这里发帖有点敏感。 PHP 会话 cookie 肯定被设置了。我可以看到使用您发送的 var 转储代码。向您发送一些调试 URL 只是为了了解正在发生的事情真是太好了?
  • 如果您在调用会话开始之前执行void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] ),假设 15 分钟 (15*60),这是否解决了您的问题? php.net/manual/en/function.session-set-cookie-params.php 通过设置固定时间,您可以从浏览器中取消会话删除并强制其存活该分钟数。
猜你喜欢
  • 2015-08-03
  • 2011-01-02
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多