【发布时间】: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