- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将此函数设置为使用指向 PHP 页面的 JavaScript 每隔一段时间运行一次。我只是想知道这对服务器负载来说是否是一种不好的做法,尤其是在大规模情况下。
PHP 页面仅通过 CURL 从 Slack API 检索数据并将其回显。
setInterval(function(){
$.post('slackAPI.php?',function(data){
//append data received to some class
}, 'html');
}, 100);
此选项非常有效,但我担心它会导致服务器负载过重,是否有更好的选项可以实时从 API 检索数据?
最佳答案
您的服务器负载有两个来源:
根据具体情况,您可以改进其中一个(甚至两个):
如果第三方信息的更新频率可能不超过“x”,您可以将调用的结果存储到数据库、内存 keystore 或缓存文件中,如果它仍然“新鲜”,则读取其内容。
更好的是,您可以使用 GET 检索数据,并从 PHP 端发出适当的 Expires
header 。这将防止大多数 AJAX 库发出不必要的调用。当然,您现在冒着无法立即检索同时出现的新信息的风险:
// 30 seconds timeout
Header('Expires: '.gmdate('D, d M Y H:i:s \\G\\M\\T', time() + 30));
如果您可以创建一个等待数据到来的 API,而不是使用固定的时间间隔,您可以将更新函数作为更新函数本身的回调。
这样,您将发出一个需要 100 到 20000 毫秒才能完成的 POST。在完成之前, 没有数据,因此同时对同一 API 发出 199 次其他调用是没有用的。当它完成时,它会立即触发一个新的 AJAX 调用,该调用将再次等待,依此类推。这最好用 jQuery Promise 循环来完成;直接用 Javascript 编写它会导致递归函数,并且您可以输入多少递归是有限制的。
另一个优点是您可以从服务器控制客户端更新频率。
您可以使用 setTimeout
而不是 setInterval
。
function refresher() {
$.get('/your/api/endpoint', { maxtimeout: 30 })
.then(function(reply) {
if (reply.changes) {
// ...update the UI? Here you call your "old" function.
}
// Immediately issue another call, which will wait.
window.setTimeout(refresher, 1);
});
}
// Call immediately. The return callback will wait.
refresher();
最好的选择是第三种:
大多数此类投票服务都可以发出长阻塞调用(您将在上面使用的调用)或注册一个 URL,当有数据要获取时,该 URL 将接收数据。然后你存储信息并缓存它,同时服务器上的接收端点保持缓存更新。您现在只需担心入站调用,这些调用会得到快速处理。
然后入站调用可以阻塞并等待,消耗很少的资源:
// $cacheFile is written by the callback API entry point
$ms = 200; // Granularity is 200 milliseconds
$seconds = 30; // Max linger time is 30 seconds (could be higher)
$delay = floor(($seconds * 1000.0) / $ms);
while ($delay--) {
// filemtime must read up-to-date information, NOT stale.
clearstatcache(false, $cacheFile);
if (filemtime($cacheFile) !== $lastCreationTime) {
break;
}
usleep($ms * 1000);
}
Header('Content-Type: application/json;charset=UTF-8');
readfile($cacheFile);
die();
以上将有 150 次 stat()
调用的开销(30 秒,每秒 5 次调用),这是绝对可以忽略不计的,并且将节省 149 次 Web 服务器调用以及所有相关的流量和延迟.
关于php - AJAX 间隔函数对服务器有害吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44791614/
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我在摆弄 LinqToSQL 和 LINQPad,我注意到 SingleOrDefault() 没有对生成的 SQL 进行任何过滤或限制(我几乎期望与 Take(1) 等效)。 因此,假设您想保护自己
我是一名优秀的程序员,十分优秀!