因此,您了解我尝试做的事情,我已经编写了一个网页,显示在MySQL插入数据库后立即记录的事件(基本上监控Windows& Mac登录/注销在网络上)。每次插入新事件时,PHP脚本都会连接到Web套接字,并向所有连接的浏览器发送消息,以通知他们新事件。当浏览器收到通知消息时,它们会运行jQuery.get("liveeventsearch.php", ...);
以从数据库中获取新事件(请参阅下面的javascript代码)。
简而言之,当收到Web套接字消息时,从数据库中获取新记录,将结果附加到表中并播放通知声音。
socket.onmessage = function(msg) {
if (msg.data == "@all new event") {
var newLastUpdate = new Date().toISOString().slice(0, 19).replace('T', ' ');
jQuery.get("liveeventsearch.php", <?php echo '{ Key:"' . $Value . '", etc... , lastupdate:lastUpdate }'; ?>, function(result) {
jQuery('#LiveResults tbody').append(result);
if (jQuery('#chkNotification-Audio').is(':checked') && result > "")
{
jQuery("#Notification-Audio").trigger("play");
}
lastUpdate = newLastUpdate;
});
}
};
我担心的是网络上目前有大约1200台设备,预计大多数(如果不是全部)设备将在5到10分钟内以大块每小时登录/注销,其中一些分散在这里并且那里。因此,浏览器(取决于提供的搜索条件)可能会在很短的时间内收到大量的Web套接字消息,如果不是同时的话(显然很多次获取liveeventsearch.php
)。这是否可能导致浏览器频繁获取结果出现问题?
如有必要,我可以在liveeventsearch.php
中提供代码。
替代方法
我曾想过在socket.onmessage
函数中添加类似的内容来降低频率。
//[PSEUDO CODE]
if (currentTime > lastUpdate + 3 seconds)
{
jQuery.get(...);
}
但是,在收到另一个可能超过3秒的Web套接字消息之前,最后一组事件将不会出现。我可能会使用一个计时器,但这种方式会破坏让网络插座提供“直播”的目的。更新。
我想到的另一个选项是创建一个只包含liveUpdates
字段的新MySQL表(例如ID
)。然后每X秒运行一次cron作业,在该表中插入一个新的ID(或者在服务器上运行一个带有连续循环的脚本做同样的事情?)。然后,我的events
表可以有一个额外的字段将每个事件绑定到最新的liveUpdates.ID
,并且cron作业可以在每次创建新的更新ID时发送Web套接字消息,而不是每次记录事件时。但这再次与使用计时器具有相同的效果。