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

标签 php javascript ajax

我将此函数设置为使用指向 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/

相关文章:

php - 从 MySQL 数据库输出数组...如何在 PHP 中删除方括号和双引号?

php - 无限数量的表得到产生

php - 用户 'www-data' @'localhost 的访问被拒绝 - 如何处理?

javascript - 如何从 MVC 在 Highcharts 中添加系列数据

jquery - 文件不是使用 Ajax/JQuery 上传,而是使用表单提交上传

PHP MySQL、页面嵌套/线程注释、LIMIT 10 OFFSET 等

javascript - 使用 lodash 对 Json/XML 集合进行分组

javascript - 为什么我的 jQuery.get() 回调没有被调用?

javascript - 使用 KnockoutJS 和单个 AJAX 调用实现无限滚动

java - Wicket 6.1 AjaxEventBehavior - 如何设置延迟?