如何使用 $http.get 有效地轮询 mySQL 数据库
How to efficiently poll mySQL database with $http.get
** ANGULAR 1.X **
大家好!我需要帮助使这个 $http.get 函数异步,正如您从代码中看到的那样,我当前的临时解决方案是将 displayData 范围设置为 setInterval。这显然不是一个有效的解决方案,因为它占用了太多 CPU、太多的用户数据,并且可能导致 UI 上出现一些闪烁。我希望在更新数据库时更新数组。
请不要推荐我切换到其他框架。
谢谢
$scope.displayData = function() {
$http.get("read.php").success(function(data) {
$scope.links = data;
});
}
setInterval(function(){$scope.displayData();}, 500);
这是我的 PHP ("read.php")
<?php
include("../php/connect.php");
session_start();
$output = array();
$team_id = $_SESSION['team_id'];
$sql = "SELECT record_id, user_id, link, note, timestamp FROM
link_bank WHERE team_id = '$team_id' AND status = 'valid'";
$result = mysqli_query($connect, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_array($result)) {
$output[] = $row;
}
echo json_encode($output);
}
?>
$http.get
已经异步了!异步函数就是在未来某个未知时间完成 运行 的任何函数。
你真正想做的是long polling。这是您定期向服务器发送请求以获取最新数据的地方,这不是一个好主意的原因有很多(包括您提到的闪烁和高 CPU 使用率)。
我知道您说过不希望任何人推荐其他框架,但是尝试编写自己的框架以在数据库更新时通知客户端是一项艰巨的任务。我们无法为您提供仅 PHP 和 Javascript.
功能的一小段代码
但是,您可以尝试使用 WebSockets 编写您自己的代码。这是按照您建议的方式进行服务器到客户端通信的最直接、非框架的方式。
检查调试工具的一些细节,有大量的网络请求需要很长时间并且没有返回任何新数据。
使用时间线记录获取客户端处理的一些细节。
客户端在我所看到的视图中并没有受到太大的影响,但是没有数据很难真正评估。
您可以通过绘制时间线然后放大记录数据的一部分来查看实际调用了哪些函数以及它们花费了多长时间。在 angular
中也有用于检查 $watchers 的不错的扩展
https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk?hl=en
如果绑定只更新一次(在 ng-repeats 中有用很多次),您可以使用 {{::bindOnce}}
语法来减少观察者。这有助于减少摘要时间,因为需要检查更改的观察者更少。如果你有一个非常长的元素列表(1000s),那么使用某种虚拟滚动条或分页 UI-component 有助于避免在 DOM.[=16 中每行元素制作 1000* 个元素=]
在服务器端,您可以使用 xdebug plugin/module 从服务器端收集分析数据,并可以使用 kcachegrind 评估该数据以查找服务器花费最多时间的位置,但也可以利用那里有某种服务器端缓存和更智能的逻辑,以避免在没有任何变化的情况下不断地访问数据库(也许考虑使用 Redis 或查看 memcached 以加快这些服务器端的速度,或者看看它是否只是网络延迟)。
更改语言或框架而不进行实际分析以获取关于到底是什么慢的数据并不是一个好举动 IMO 只会在新热点之间跳来跳去而不了解为什么或是否重要。
下面的示例来自 PHP 脚本的相对较快的响应。它基本上什么都不做,只是吐出一个硬编码的 JSON 响应,使用 Redis 或 memcached 不会有太多额外的开销来取回响应,尤其是空响应。
** ANGULAR 1.X ** 大家好!我需要帮助使这个 $http.get 函数异步,正如您从代码中看到的那样,我当前的临时解决方案是将 displayData 范围设置为 setInterval。这显然不是一个有效的解决方案,因为它占用了太多 CPU、太多的用户数据,并且可能导致 UI 上出现一些闪烁。我希望在更新数据库时更新数组。 请不要推荐我切换到其他框架。 谢谢
$scope.displayData = function() {
$http.get("read.php").success(function(data) {
$scope.links = data;
});
}
setInterval(function(){$scope.displayData();}, 500);
这是我的 PHP ("read.php")
<?php
include("../php/connect.php");
session_start();
$output = array();
$team_id = $_SESSION['team_id'];
$sql = "SELECT record_id, user_id, link, note, timestamp FROM
link_bank WHERE team_id = '$team_id' AND status = 'valid'";
$result = mysqli_query($connect, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_array($result)) {
$output[] = $row;
}
echo json_encode($output);
}
?>
$http.get
已经异步了!异步函数就是在未来某个未知时间完成 运行 的任何函数。
你真正想做的是long polling。这是您定期向服务器发送请求以获取最新数据的地方,这不是一个好主意的原因有很多(包括您提到的闪烁和高 CPU 使用率)。
我知道您说过不希望任何人推荐其他框架,但是尝试编写自己的框架以在数据库更新时通知客户端是一项艰巨的任务。我们无法为您提供仅 PHP 和 Javascript.
功能的一小段代码但是,您可以尝试使用 WebSockets 编写您自己的代码。这是按照您建议的方式进行服务器到客户端通信的最直接、非框架的方式。
检查调试工具的一些细节,有大量的网络请求需要很长时间并且没有返回任何新数据。
使用时间线记录获取客户端处理的一些细节。
客户端在我所看到的视图中并没有受到太大的影响,但是没有数据很难真正评估。
您可以通过绘制时间线然后放大记录数据的一部分来查看实际调用了哪些函数以及它们花费了多长时间。在 angular
中也有用于检查 $watchers 的不错的扩展https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk?hl=en
如果绑定只更新一次(在 ng-repeats 中有用很多次),您可以使用 {{::bindOnce}}
语法来减少观察者。这有助于减少摘要时间,因为需要检查更改的观察者更少。如果你有一个非常长的元素列表(1000s),那么使用某种虚拟滚动条或分页 UI-component 有助于避免在 DOM.[=16 中每行元素制作 1000* 个元素=]
在服务器端,您可以使用 xdebug plugin/module 从服务器端收集分析数据,并可以使用 kcachegrind 评估该数据以查找服务器花费最多时间的位置,但也可以利用那里有某种服务器端缓存和更智能的逻辑,以避免在没有任何变化的情况下不断地访问数据库(也许考虑使用 Redis 或查看 memcached 以加快这些服务器端的速度,或者看看它是否只是网络延迟)。
更改语言或框架而不进行实际分析以获取关于到底是什么慢的数据并不是一个好举动 IMO 只会在新热点之间跳来跳去而不了解为什么或是否重要。
下面的示例来自 PHP 脚本的相对较快的响应。它基本上什么都不做,只是吐出一个硬编码的 JSON 响应,使用 Redis 或 memcached 不会有太多额外的开销来取回响应,尤其是空响应。