【问题标题】:Bidirectional server/client communication in JavaScript and PHPJavaScript 和 PHP 中的双向服务器/客户端通信
【发布时间】:2021-02-10 22:01:16
【问题描述】:

我想使用 JavaScript(没有 jQuery)和 PHP 创建一个多人游戏,其中大多数机制都使用 AJAX 调用。但是,我需要确定用户何时离开游戏以更新其他玩家屏幕上的玩家状态(我假设是通过常规 AJAX 请求?)。此外,一旦所有玩家都将游戏文件(.txts)留在服务器上,就需要删除。

我正在使用免费的网络托管服务,这意味着我不能使用 WebSockets 或 cron 作业。我也不想使用 Node.js。我读过的大部分内容都建议定期为 PHP 会话添加时间戳,这很好,但我想知道如何检查以查看用户/游戏是否在一段时间内处于非活动状态。

另外,使用window.onbeforeunload 太不可靠了,以防浏览器崩溃等。

【问题讨论】:

  • 您将要使用navigator.sendBeacon 注销,使用visibilitychange 事件注销。 onbeforeunload 并不总是有效,navigator.sendBeacon 在没有响应时也不会被切断,这与传统的 XMLHttpRequest 不同。
  • Websockets 是这里的正确解决方案。升级您的主机。不要为工作使用错误的工具。
  • 糟糕。我使用的是onunload,它适用于桌面浏览器,但后来我在我发布的第一个链接中看到了visibilitychange 注释。经过一些测试,我现在认为您应该将navigator.sendBeacon 与pagehide 事件一起使用。
  • 无论您使用什么网络主机,在通常的 http 端口(80、443)上使用 websocket 都应该没有问题:请参阅here。
  • @gWay 问题不会出在端口上。在免费/便宜的共享主机上,通常不允许您运行自己的守护进程或 Cron 作业或其他长时间运行的进程。这使得运行可靠的 websocket 服务器几乎是不可能的。

标签: javascript php


【解决方案1】:

不要为工作使用错误的工具。

您为此尝试的任何基于 AJAX 的解决方案都可能非常低效或不可靠,或者可能两者兼而有之。如果您有超过少量的并发用户,那么大量的 AJAX 请求可能会使服务器不堪重负,并可能会破坏您的每月配额。正如您所发现的,通过关闭浏览器窗口来确定某人何时结束会话并不简单或可靠。我建议不要使用任何此类架构。

Websockets 确实是客户端和服务器之间实时或近实时更新的正确解决方案(反之亦然)。套接字服务器也很容易知道某人何时断开连接(如果他们关闭窗口/选项卡就会发生这种情况)。

因此,您可以升级您的主机,以便能够成功运行 websocket 服务器,或者尝试集成托管在其他地方的基于 websocket 的解决方案,例如Azure SignalR 或一些类似产品(我没有在答案中提出具体建议,因为这被认为是题外话)。

【讨论】:

    【解决方案2】:

    使用间隔函数并每秒 ping 一次 php 端点。 如果它停止用户退出

    【讨论】:

    • 这是非常低效的
    • 这听起来像是一个愚蠢的问题,但我该如何在 PHP 中实际实现呢?
    • @ADyson 是对的,但它不是它的方式。但我猜你不是在新 GTA 上开发的摇滚明星游戏开发者......所以为了小目的它会做它的事情。只需给每个客户一个令牌。然后使用 js intervall 函数调用发送令牌的 php 端点。在php中,您将获得每个登录客户端的心跳
    • 这可能会计入主机每天的点击配额...
    • @Haennie 我认为过多的呼叫会禁止我使用托管服务......在这种情况下不愿意让我自己的经历!由于您的答案是唯一的答案,如果没有其他人很快出现,我会接受它。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多