【问题标题】:Knowing real time an user is in my site实时了解用户在我的网站中
【发布时间】:2011-09-06 05:11:37
【问题描述】:

我有一个网站,我必须(使用 PHP 和/或 JavaScript)实现一条警报消息,该消息会在访问者进入该网站两分钟后触发。我已经搜索过,但我找到的所有解决方案都是针对一个独特的页面。当用户进入我的网站时,无论通过哪个页面,我都需要启动计时器计数器。当用户浏览我的网站页面时,我需要该计数器不断计数。

一种解决方案可能是使用会话变量。我可以制作一个查找此变量的脚本,如果它不存在则意味着用户正在进入该站点。然后我用当前时间设置这个变量。它在每个页面中的脚本,它会每 x 秒通过 AJAX 读取这个变量,我会知道用户从两分钟后何时进入我的网站。

我不知道它是否正确(我还没有实现),但我不太确定 session 是否是最好的方法。如果用户离开页面但打开了其他导航窗口,则会话不会过期,如果他再次进入该站点,则不会重置计数器。

那么,两个问题:

  1. 有没有更好的方法 更多控制真实进入 并退出?
  2. 如果不是,是我上面的 接近正确吗?

谢谢。

【问题讨论】:

  • 您的想法很好,但我建议在 javascript 中使用 cookie 实现相同的想法。 1)在第一次加载时检查您的cookie是否已经存在,如果不存在,请将其设置为当前时间(注意服务器和客户端时间可能不同,因此使用一个时钟计时)。 2)setTimeout(...)第一次2分钟(2分钟减去cookie时间和页面重新加载时的当前时间之间的差异)。
  • 但是如果我创建了一个cookie,当用户离开我的站点然后重新进入时,cookie 将保留,我将无法知道它是否进入。我错了吗?
  • 您可以设置逻辑,如果 document.referrer 不是重置 cookie 的站点。最简单的方法是检查它是否包含您的域。
  • 您可以信任 cookie 的过期时间(浏览器会为您执行此操作,因此无需关心)。默认情况下,cookie 在浏览器关闭时过期,我想这就是你想要的。或者,您可以手动将过期时间设置为任何所需的值(30 分钟?1 小时?1 天?)
  • 如果用户打开了其他浏览器窗口或选项卡,当他关闭我的网站时cookie会过期?如果不是,那和使用会话是一样的,不是吗?

标签: php javascript jquery session


【解决方案1】:

这样的事情应该可以工作。

$alert_message = false;

if(!isset($_SESSION['time_entered'])){
    $_SESSION['time_entered'] = time();
}

if($_SESSION['time_entered'] =< time() - 120){
    if(!isset($_SESSION['message_sent'])){
        $alert_message = true;
        $_SESSION['message_sent'] = true;
    }
}

&lt;head&gt;:

<?php if($alert_message):?>
<script type="text/javascript">alert("You've been here for at least two minutes.");</script>
<?php endif;?>

还要确保在每个脚本的顶部都有session_start()

【讨论】:

  • 谢谢,卡尔。这是我的方法的实现,但我想知道是否有一种方法可以实际控制进入和退出,因为会话没有(我认为)。
  • 没有。除非会话被用户关闭,例如注销。
  • 我认为这会在所有页面上触发(如果用户同时打开了多个页面),所以如果没有 AJAX,你真的无法做到这一点。
  • 而且我认为这只会在进入页面时触发警报。如果“时刻”到来并且用户正在查看一个页面,那么在他转到另一个页面或刷新当前页面之前,他不会看到警报。
【解决方案2】:

你不需要AJAX,你只需要将时间存储在一个会话变量中,然后在每个页面上包含一些JavaScript,这里是一个例子:

<?php
session_start();

$time = microtime(true);

if (!$_SESSION['foo']) {
    $_SESSION['foo'] = (microtime(true)+120);
}
?>
<script type="text/javascript">
    var timeoutID = setTimeout(function() {
        alert('two minutes have passed');
    }, <?php echo bcsub($_SESSION['foo'], $time)*1000 ?>);
</script>

您将需要一些额外的逻辑,以便在 120 秒结束后它不会继续触发。

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 2022-07-22
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2013-09-25
    • 2015-10-03
    相关资源
    最近更新 更多