【问题标题】:sending an alert messages from server to client automatically without postbacks自动从服务器向客户端发送警报消息,无需回发
【发布时间】:2012-03-16 17:39:53
【问题描述】:

我正在尝试在我的电子商务网站上实现一项功能,但我不知道如何做或从哪里开始。

我想提醒我的客户,他们已经通过验证并登录到我的网站,如果其他人使用他们的(登录用户的)登录凭据进行黑客攻击或任何其他安全风险,尝试使用任何其他人再次登录计算机或浏览器。我可以提醒已经登录的用户尽快更改密码以提高安全性,或者如果是同一用户尝试从多个客户端登录,那么他将受到限制。

我将在我的数据库中维护一个已登录用户的列表,并验证用户是否已经登录。但是我如何在不让用户从客户端发起任何回发的情况下动态发送 警报 因为一旦进行其他登录尝试,我的脚本应该立即提醒已经登录的用户。

我希望我已经明确了我的要求。如果有什么不清楚的地方请评论,我会澄清的。

我正在使用 PHP 5.3 和 MySQL 5.5。并且该站点将托管在 linux 主机上。

我认为 AJAX 会有所帮助,但如何。我正在寻找解决方案很多天,但没有运气。

请帮忙。

【问题讨论】:

  • 是的,ajax 是最好的方法,看看 javascript API 中的 XMLHttpRequest 对象
  • 你需要看一下答案并从中挑选一些作为答案。

标签: php javascript jquery mysql ajax


【解决方案1】:

您正在寻找一种称为服务器推送的技术。

TLDR: 创建一个接受请求的服务器方法,然后阻止执行,直到某个定义的时间过去或某些服务器端事件发生。根据是服务器端事件还是超时,向客户端返回不同的响应。从客户端 - 使用长超时设置对此方法进行 AJAX 调用并处理响应。

请查看my answer for similar question

UPD:另外,正如@AndreiG 所建议的,您可以通过连续轮询来实现类似的功能。这不太复杂,但对服务器端事件的响应速度较慢。

【讨论】:

  • 服务器推送,在与服务器推送相关的事件发生之前保持请求打开,在这里可能不是合适的选项。作为应该发生服务器推送的事件,在这种情况下可能永远不会发生......
  • @vishwanath:在我的回答中,我指定了“直到某个定义的时间过去”选项。
【解决方案2】:

使用 ajax,您可以在一个 url 上进行连续轮询,您可以在其中显示是否需要触发警报。您可以每隔几秒或您选择的间隔执行一次。

【讨论】:

    【解决方案3】:

    当用户登录时,在用户表中写入用户会话 ID。并每隔 5-10 秒检查一次您想要使用 ajax 请求的值是否与数据库中的当前会话 ID 相等。

    如果这些值不同,则表示有人使用相同的用户凭据登录。

    【讨论】:

      【解决方案4】:

      你说的是长轮询。

      “长轮询”是用于描述以下技术的名称:

      • 发出 AJAX 请求(使用 javascript 框架,例如 jQuery) 服务器等待请求的数据可用, 循环和休眠(您的服务器端 PHP 脚本)
      • 此循环在数据返回客户端并处理后重复 (通常在您的 AJAX 请求的 onComplete 回调函数中)

      这实质上是模拟从客户端到服务器的连续实时流。由于许多原因,我不会在 PHP 中这样做。这里有一些:

      • PHP 是为快速执行而设计的(不是为了等待)
      • PHP 将强制您在服务器端进行某种轮询,然后 依赖 sleep()
      • PHP 会吃掉你的 RAM,而每个进程的生成进程也是如此 请求(Apache 会这样做)
      • 不要将 Apache 服务器用于此目的! Apache 服务器将能够更好地处理数以万计的短有限连接,而不是数百个持久连接。无论您朝哪个方向发展(长轮询与 ajax),您可能需要考虑设置一个专用于聊天的更轻量级的网络服务器。像 Lighttpd 或 Nginx 这样的东西,在相同的内存/CPU 条件下,它们可以有更多的 max_clients 或更多的并发请求。

      但是你可以做到,使用睡眠,轮询数据库(或者更好的缓存 APC/Memcache)。

      如果您想做类似的事情,请使用一些可以处理事件的技术:Python(Tornado、gevent、eventlet、Twisted,...)、Ruby(Eventmachine,...)、Erlang、Scala、服务器端 JavaScript(node .js,……),彗星……

      相反,您可以使用简单的方法

      看看这张表。

      你可以这样做

      1. 创建一些名为的数据库表,例如。 log 并在用户登录您的站点时记录一些各种数据(例如 ip、登录日期...)。将 signout_date 字段留空。 (当用户退出时,只需更新此表并放置当前日期)因此,如果有人在您的网站上,则退出日期字段必须为空

      2. 然后在每个用户活动中,检查您的表中的user_id:如果有多个行具有相同的user_id 和空的注销日期字段。然后只需通知用户,另一台电脑使用您的凭据登录。

      【讨论】:

        【解决方案5】:

        在 ASP 中有一种称为 Signalr 的技术。你必须在 php 中找到它的替代方案,我认为 Sockets.Maybe Ratchet 或 Wrench 可以完成这项工作。 Read Here

        【讨论】:

          猜你喜欢
          • 2017-01-12
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 2015-01-05
          • 1970-01-01
          相关资源
          最近更新 更多