我需要一个解决方案来确定我网站每个用户的在线/离线状态。我的网站是一个单一页面,没有任何链接点击等,并且,在大多数情况下,用户只需将标签保持打开一段时间而不做任何事情。用户离线的时间并不需要太精确地确定,可能在十分钟左右的时间内实际脱机。
由于这些标准,我无法使用数据库解决方案来检测用户对时间戳的不活动,并且我需要让我的网站可以访问尽可能多的浏览器和版本,因此Web套接字可能不在方程。 Javascript" onunload"和"卸载"事件似乎无法发现意外系统关闭等事件,因此不够准确。
我对在索引页面中设置某种长轮询脚本感兴趣,该脚本会间隔地向PHP脚本发送一个信号,让服务器知道用户仍然是#34; alive"并使用该页面。
我需要帮助编写代码,任何人都可以帮忙吗? 它主要实现了一个"听众"在我正在努力的PHP中。
PS我不确定它是否会发生任何变化,但是一旦确定用户离线,我需要运行一个我已编写的小PHP脚本,该脚本将删除一些相应的数据。 JSON文件。
答案 0 :(得分:2)
PHP在服务器端,并且php无法知道此页面上发生了什么。您可以使用时间并在闲置5分钟后将用户设置为离线。但由于您的网页上没有链接点击,因此很难跟踪活动。
一个选项可能是在您的页面上使用JavaSript,它将每隔5分钟与服务器联系,以告知您该页面仍然在客户端浏览器中打开。即使用户没有主动查看您的页面,这也会有效。您可以进一步检测是否在页面上设置了用户的焦点。因此,删除将使他们专注于您的页面。
答案 1 :(得分:2)
根据MadeInDreams和Sheepherder的建议,我找到了满足我要求的解决方案。
间隔触发Ajax调用以发送"仍然活着" index.php中的信号:
<script type="text/javascript">
function ping() {
$.ajax({
type: "POST",
url: 'json_update.php',
data: ({signal:"1"}),
success: function(data) {
handleData(data);
}
});
}
setInterval(ping, 60000);
</script>
在json_updater.php中:
if($_POST['signal'])
{
// update timestamp for user in json file from calling time() function.
json_maintainer.php:
// this script is called by a chron job on the server every 1 minute.
// it deletes all json entries with a timestamp which is older than time() -
120.
这似乎非常准确。为了以精度为代价减少负载,可以相应地调整ping频率和垃圾收集。
由于可能同时由两个脚本写入json文件,因此需要正确的文件锁定以防止数据损坏。如果正在使用数据库系统,则排队机制会否定此问题,并且不适用。
答案 2 :(得分:0)
如果您的页面是一个php页面,您可以收集访问者的IP地址或计算机名称,并在浏览器访问您的站点时将其存储在数据库中。然后将其设置为每分钟更新一次该数据。列将是id,user,userlive。
userlive将每分钟更新一次,其中user ='ip或computer name'。
您将按日期时间或时间戳或您的选择进行更新。