【问题标题】:Handling situation where User closes browser in php用户在php中关闭浏览器的处理情况
【发布时间】:2023-12-17 13:43:02
【问题描述】:

我有一个 buy.php 页面,用户在其中选择产品,输入一些数据,例如他的姓名、地址等。接下来他点击“购买”按钮移动到支付网关站点,输入他的信用卡号 + CVV没有等。此时,如果不点击此页面上的“支付”按钮,他会关闭浏览器或关闭他的计算机。此交易 ID 保存在 Session 中。

如何在 PHP 的数据库中跟踪这种情况并将其保存为“用户中止”并针对他的事务 ID?

【问题讨论】:

  • 您无法跟踪用户是否离开网站。您所能做的就是将订单设置为“用户中止”,如果它们在指定的时间内从未通过某个状态。

标签: php


【解决方案1】:

我们处理此问题的方式是从一开始就将数据库中的事务状态保持为“不完整”(或在您的情况下为“中止”)。支付完成后,交易状态变为“完成”。

【讨论】:

    【解决方案2】:

    您无法通过 php(服务器端)处理浏览器事件(客户端)

    使用jQuery函数.unload()应该在浏览器窗口关闭时触发

    文档:http://api.jquery.com/unload/

    注意:当客户端计算机立即断电时(不使用“开始”>“关闭”或类似的操作系统功能),没有什么可以关心的情况

    注意2:网页中的任何内容都无法处理崩溃或killed浏览器

    【讨论】:

    • 这并不总是有效。例如,如果浏览器被进程管理杀死(例如 unix "kill" 命令),那么这个函数将不会被调用。另外如果浏览器崩溃,这个函数也不会被调用。
    • 更不用说在浏览器关闭时向服务器发送异步调用有可能在调用返回之前线程被杀死。
    • 正如 Cobra_Fast 所说,我们可以设置一些超时时间,并且找不到客户端-服务器连接,我们可以确定它是“中止”的连接。 PHP 有 connection_aborted() 等函数,但是这些函数在哪里写呢?在 buy.php 脚本接受输入并点击其“购买”按钮后,它将用户重定向到支付网关站点。
    • 但 connection_aborted() 仅在执行 php 代码时可用,而不是在页面加载后使用
    【解决方案3】:

    虽然您可以潜在地利用 Javascript 来捕获浏览器的关闭事件,但除非您想非常快速地执行某项操作并且不寻求任何关于其成功的反馈,否则您可能想尝试不同的方法。

    从您上面所说的看来,您似乎正在尝试将给定的事务分类为已中止,您只需跟踪数据库后端中的不同事务阶段即可做到这一点。为给定事务设置不同的阶段,然后将其设置为“中止”,如果它即将被处理并且已在该阶段挂起给定的时间。

    【讨论】:

      【解决方案4】:

      在 PHP 内部维护连接状态。有3个 可能的状态:

      0 - 正常 1 - 中止 2 - 超时

      当 PHP 脚本运行时 通常正常状态,是活动的。如果远程客户端断开连接 ABORTED 状态标志打开。远程客户端断开连接是 通常是由用户点击他的 STOP 按钮引起的。如果 PHP 强加 达到时间限制(参见 set_time_limit()),TIMEOUT 状态标志为 开启。

      This page 我猜会回答你的问题。

      【讨论】:

      • 我相信这仅适用于 persistent HTTP connection 的情况 - 并非总是如此,因此不能依赖。即使连接被中止并不一定意味着“用户已经中止”(即他可能仍然打开页面并稍后按“支付”按钮)。
      【解决方案5】:

      Aleks G 建议的方法是最好的 - 但是,作为次要措施,您可以在浏览器和服务器之间引入某种“心跳”。 例如,在指定的时间间隔内发出 AJAX 请求,让服务器知道用户“活着”(页面在他的浏览器中打开)。

      但是,我再说一遍,这只能用作辅助措施,您不能依赖它来设置交易状态。没有明确的方法可以知道用户/浏览器是否“仍然存在”。

      【讨论】:

        最近更新 更多