在没有回发的情况下自动从服务器向客户端发送警报消息

时间:2012-02-27 08:11:10

标签: php javascript jquery mysql ajax

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

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

我将在我的数据库中维护已登录用户的列表,并将验证用户是否已登录。但是如何动态发送警报,而无需用户从客户端提出任何回发因为只要进行其他登录尝试,我的脚本就会立即警告已登录的用户。

我希望我的要求清楚。如果有什么含糊不清的请评论,我会清楚。

我使用的是PHP 5.3和MySQL 5.5。该网站将托管在linux主机上。

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

请帮忙。

5 个答案:

答案 0 :(得分:2)

你在谈论长轮询。

"长期投票"是用于描述以下技术的名称:

  • 制作一个AJAX请求(利用javascript框架,如 jQuery)服务器等待请求的数据可用, 循环和休眠(您的服务器端PHP脚本)
  • 在将数据返回到客户端并进行处理后,将重复此循环 (通常在您的AJAX请求中的onComplete回调函数中)

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

  • PHP用于快速执行(不等待)
  • PHP将强制您在服务器端进行某种轮询 依靠sleep()
  • PHP会占用你的RAM,而每个人都会产生进程 请求(Apache将这样做)
  • 不要为此目的使用Apache服务器! Apache Server能够比几百个持久连接更好地处理成千上万的短有限连接。无论你走哪个方向(长轮询与ajax)你可能想要设置一个专门用于聊天的轻量级网络服务器。类似于Lighttpd或Nginx,在相同的内存/ CPU条件下,可以有更多的max_clients或更多的同时请求。

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

如果你想做类似的事情跳进一些可以处理事件的技术:Python(Tornado,gevent,eventlet,Twisted,...),Ruby(Eventmachine,...),Erlang,Scala,Server Side JavaScript(节点) .js,...),Comet ......

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

enter image description here

看一下这张桌子。

你可以做那样的事情

  1. 为ex创建一个名为db的表。当用户登录您的网站时,log并记录一些不同的数据(例如IP,登录日期......)。将signout_date字段留空。 (当用户注销时只需更新此表并放置当前日期)因此,如果有人在您的网站上,则注销日期字段必须为空

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

答案 1 :(得分:0)

您正在寻找一种名为Server Push的技术。

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

请检查my answer for similar question

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

ASP中有一种名为Signalr的技术。你必须在php中找到它的替代品,我认为Sockets.Maybe Ratchet或Wrench做的工作。 Read Here