【问题标题】:PHP - How to tell if a page is being usedPHP - 如何判断页面是否正在使用
【发布时间】:2014-08-05 04:43:47
【问题描述】:

所以我基本上在网站上有一个所见即所得的编辑器。

我希望能够判断用户当前是否正在编辑页面,以防止其他用户在“忙碌”时进入该页面。

我在 mySQL 中实现了一个将文章标记为忙碌的系统。当用户进入页面进行编辑时,它会将其标记为忙碌,并通过将函数绑定到 window.onbeforeunload 来取消标记。

但是,如果页面意外关闭,例如浏览器崩溃或被强制关闭,则不会调用 window.onbeforeunload。这导致某些文章在不应该被标记为忙碌时。

有没有更合适的方法来实现这个?

【问题讨论】:

    标签: php mysql web content-management-system wysiwyg


    【解决方案1】:

    如果页面定期(例如每 10 秒一次)请求“keepalive”页面(在 URL 中包含当前时间,因此页面不会被缓存!),并且最后一个时间戳保存在数据库中,那么你可以有一个超时 - 任何“打开”的页面如果没有请求“keepalive”,比如 30 秒,可能不再打开。

    【讨论】:

    • 保留最后一个时间戳是个好主意。我早该想到的。
    【解决方案2】:

    也许最便携的方法是在编辑页面加载时将页面标记为“忙碌”,并在一段时间后取消标记(可能是 3 分钟)。然后,每隔一分钟左右发出一个 AJAX 请求,以更新忙碌标记。这样,只要页面处于打开状态并且正在发出 AJAX 请求,页面就会被标记为忙碌。

    如果浏览器支持,您仍然可以保留 onbeforeunload 事件处理程序来取消标记页面,但如果浏览器不支持,那么它将在用户关闭页面后 3 分钟内取消标记。

    【讨论】:

    • 所以我必须设置一个 cron 来将所有页面标记为不忙。而且它不会导致失误,页面会反复从忙碌切换到不忙碌吗?
    • @Nikzilla 如果超时(例如 3 分钟)长于轮询频率(1 分钟),则不会。您希望每 3 分钟进行一次民意调查,这将重置时间。您根本不需要 cron 作业,只需使用类似以下的查询:SELECT ..., (CASE WHEN busy_date IS NULL THEN FALSE ELSE DATE_ADD(busy_date, INTERVAL 3 minutes) <= NOW() END) AS is_busy。每次发出 AJAX 请求时,您都会UPDATE ... SET busy_date = NOW()CASE 让您不必清除任何标记;您只需查看标记是在多长时间前设置的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2013-02-23
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多