【发布时间】:2015-02-18 20:59:09
【问题描述】:
我的应用程序是数字标牌播放器。我们需要定期将远程播放证明数据发送回云端。缓存播放证明数据以帮助解决网络中断问题。
玩家一天可以轻松创建 6,000 条 POP 记录。当网络恢复正常时,这可能会导致从一个演示文稿转移到另一个演示文稿时出现相当严重的延迟。
我正在考虑使用 MySql 的异步模式来尝试缓解这种延迟......但我认为它并没有像我想的那样做。
我正在循环一个大型结果集,我仍然需要等待该循环完成。我是否捆绑了 6,000 个插页并一次全部发送?如果我仍在等待异步数据库调用,我的 AJAX 会在什么时候返回结果?它只是不能以这种方式工作吗? Google 返回的结果不到一页,而 Docs 并没有真正说明任何问题。
$sql = "SELECT MAX(time) from `pop` where `displayId` = ".$_GET['id'];
$res = $local->query($sql);
$row = $res->fetch_row();
//$log->lwrite("Last Updated is ".$row[0]);
$sql = "SELECT * FROM `pop`
WHERE `displayId` = ".$_GET['id']
." AND `time` > '".$row[0]."' LIMIT 1000";
$local->query($sql, MYSQLI_ASYNC);
if ($res = $local->reap_async_query()) {
while ($row = $res->fetch_row()) {
$log->lwrite(print_r($row, 1));
$sql = "INSERT INTO `pop`
(`displayId`, `time`, `duration`, `presId`)
VALUES ('".$row[1]."', '".$row[2]."', '".$row[3]."', '".$row[4]."')";
$remote->query($sql, MYSQLI_ASYNC);
}
}
我已经接受了我将不得不以不同的方式来做这件事的想法。现在我只是好奇。 :)
我错过了什么吗?
感谢您的时间和帮助。
【问题讨论】:
-
按原样与您的代码进行异步是没有意义的。您触发查询,然后开始循环等待它返回。您不妨启动一个同步查询并等待该调用返回。
-
谢谢马克。我希望通过限制接口的数量来保持客户端的简单,但是通过将 POP 移动到它自己的 API/定时循环很容易解决。除非我遗漏了一些东西,否则无论格式如何,API 调用都不会返回,直到 ASYNC 调用已经获得。我只是想知道 ASYNC 如何真正为服务器端语言做任何有用的事情。
-
一个可悲的 XY 问题教科书示例
-
YCS 指出的 sql 注入漏洞被否决