【问题标题】:Check if user closed the page in PHP?检查用户是否在 PHP 中关闭了页面?
【发布时间】:2010-01-02 20:37:05
【问题描述】:

我使用 PHP 和 JavaScript 聊天进行了聊天,并且有一个断开连接按钮,可以将用户从聊天中删除,首先将他从用户列表中删除。但是如果用户关闭浏览器,那么他将保留在用户列表中。如何查看他是否离开?

这必须在 JS 中在页面关闭时放置任何句柄,因为如果用户关闭浏览器,那么他将继续聊天。

顺便说一句,JS 脚本总是向 PHP 页面发送一个请求,该页面不断检查循环中的新消息,当有新消息时,脚本将它们打印出来并退出。然后又重复一遍。

编辑:如何在 PHP 中制作心跳?如果用户关闭页面,脚本执行将被终止,因此我们将无法检查用户是否仍连接在同一脚本中。

【问题讨论】:

  • 如果聊天,为什么不能修改客户端代码?
  • 我制作了服务器脚本,但没有制作客户端脚本

标签: javascript php


【解决方案1】:

抱歉,没有可靠的方法来做到这一点,这就是 HTTP 的构建方式——它是一个“拉”协议。 我能想到的唯一解决方案是“有效”且已登录的客户端必须以非常小的间隔查询服务器。如果他们不这样做,他们就会被注销。

【讨论】:

    【解决方案2】:

    您可以每 5 秒向您的服务器发送一个微小的 ajax 调用。不这样做的用户就不再在房间里了

    【讨论】:

    • 有两种优化方法:如果您愿意处理大量同时(但空闲)的连接(apache+php 并不擅长,但 Comet 擅长)选择 long -polling 意味着您每隔几分钟就会创建一个连接,并且您将获得关于连接丢失的最新信息。另一方面,如果您使用周期性心跳,您将建立和断开更多连接,但在任何给定时间您可能会打开更少的连接。此外,您的轮询间隔将决定您发现丢弃缺点的分辨率
    【解决方案3】:

    您回答了自己的问题:如果您在给定的时间长度(超过几秒钟)内没有检测到用户对新消息的请求,那么他们就离开了房间。

    HTTP 的性质决定了您需要进行某种 AJAX 类型的通信。如果您不想收听“给我更多消息”请求(不知道为什么不想),请构建心跳类型的通信。

    【讨论】:

      【解决方案4】:

      如果你因为某种原因不能修改 JS 代码,你真的无能为力。您可以对 PHP 做的唯一一件事就是检查例如从上次活动开始超过 15 分钟,用户是否离开了。但这绝不是明智的做法——用户可能只是坐下来观看对话 15 分钟。

      如果您想可靠地执行此操作,唯一正确的方法是在设定的时间间隔内使用 AJAX 轮询。

      您注意到用户不断地轮询服务器以获取新消息,您不能用它来检测用户是否离开了吗?

      【讨论】:

        【解决方案5】:

        维护服务器上的活跃用户列表,以及他们上次连接到聊天以请求新消息的时间。

        当用户连接检查消息时更新他们的时间。

        每当您的代码运行时,迭代此列表并删除未连接时间过长的用户。

        唯一的失败是如果频道中的用户数下降到零,服务器不会注意到,直到有人回来。

        【讨论】:

          【解决方案6】:

          要解决您的编辑问题,您可以使用 ignore_user_abort 忽略客户端终止。

          【讨论】:

            【解决方案7】:

            使用 javascript 你可以做到以下几点:

            <script type="text/javascript">
            
            window.onunload = unloadPage;
            
            function unloadPage()
            {
             alert("unload event detected!");
            }
            </script>
            

            对你的 PHP 脚本的 unloadPage() 函数进行必要的 ajax 调用

            【讨论】:

              【解决方案8】:

              请求一个类似这样的 PHP 脚本,使用 AJAX:

              register_shutdown_function("disconnect_current_user");
              header('Content-type: multipart/x-mixed-replace; boundary="pulse"');
              
              while(true) {
                 echo "--pulse\r\n.\r\n";
                 sleep(2);
              }
              

              这样,您就不会经常打开/关闭连接。

              【讨论】:

                【解决方案9】:

                OP 提出的所有问题的答案都包含在手册中有关连接处理的部分中:

                http://uk3.php.net/manual/en/features.connection-handling.php

                没有 Ajax。

                没有 Javascript。

                没有保命。

                C.

                【讨论】:

                  猜你喜欢
                  • 2015-03-09
                  • 2011-10-24
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-15
                  • 2021-06-11
                  相关资源
                  最近更新 更多