【问题标题】:Long polling issue长轮询问题
【发布时间】:2013-11-24 14:51:35
【问题描述】:

我有一个奇怪的问题,我正在做长时间的轮询以检查 MySQL 表中是否出现了新的东西,一切正常,一旦它们出现在表中,我就会收到消息。但问题是当我尝试重新加载我的页面 (F5) 时,我必须等到服务器端功能完成,然后我的页面才会刷新。

例如我的长轮询开始并且我在执行的第一秒刷新页面,我必须等待 29 秒才能刷新页面。

有人知道怎么回事吗?

提前致谢!

这里是代码

php

public function longPolling() {
    if (isset($_POST['timestamp'])) {
        $timestamp = $_POST['timestamp'];
    }
    $end = time() + 20;
    while (time() <= $end) {
        $data = $this->db->select("SELECT id, status, error, start, end, ackby FROM event WHERE start > '$timestamp'", 0);
        if ($data) {
            echo json_encode(array('status' => 1, 'timestamp' => date('Y-m-d H:i:s')));
            break;
        } 
        usleep(25000);
    }
}

JS

function startPoll(timestamp) {
    $.ajax({
        url: 'dashboard/longPolling',
        type: 'POST',
        dataType: 'json',
        timeout: 30000,
        cache: false,
        data: {
            timestamp: timestamp
        },
        success: function(data) {
            if (data != null && data.status == 1) {
                oTable.fnReloadAjax();
                timestamp = data.timestamp;
            }
            setTimeout(function(){
                startPoll(timestamp);
            }, 100)
        }

    });
}

附: ignore_user_abort 已禁用。

【问题讨论】:

  • 您使用什么来“轮询表” - mySQL 事件/触发器或其他方法?
  • 在不知道代码的情况下很难猜到。这可能是会话或数据库的锁定问题。如果您进行长时间轮询,则某些内容会锁定在服务器上。如果你重新加载它会等到锁被释放。
  • 我正在使用简单的 while 循环来检查表中是否有新的时间戳

标签: php jquery mysql long-polling


【解决方案1】:

似乎在刷新时您正在显示的数据没有保留,因此您在等待后端发生更改时丢失了它,您什么​​也没有显示

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多