gpt4 book ai didi

php - AJAX 间隔函数对服务器有害吗?

转载 作者:行者123 更新时间:2023-11-30 15:13:32 24 4
gpt4 key购买 nike

我将此函数设置为使用指向 PHP 页面的 JavaScript 每隔一段时间运行一次。我只是想知道这对服务器负载来说是否是一种不好的做法,尤其是在大规模情况下。

PHP 页面仅通过 CURL 从 Slack API 检索数据并将其回显。

setInterval(function(){

$.post('slackAPI.php?',function(data){

//append data received to some class

}, 'html');
}, 100);

此选项非常有效,但我担心它会导致服务器负载过重,是否有更好的选项可以实时从 API 检索数据?

最佳答案

您的服务器负载有两个来源:

  • 必须处理传入的 AJAX 调用,
  • 必须发出 Slack 调用并获得它的返回值。

根据具体情况,您可以改进其中一个(甚至两个):

缓存第三方调用

如果第三方信息的更新频率可能不超过“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));

用链式 AJAX 调用替换固定间隔。

如果您可以创建一个等待数据到来的 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();

最好的选择是第三种:

更改 API。

大多数此类投票服务都可以发出长阻塞调用(您将在上面使用的调用)或注册一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com