我在Windows Server 2008上使用PHP而不是IIS 7.5。
我的Web应用程序在后台3个不同的JSON页面中反复请求Ajax:
他们检索与某些表的当前状态相关的数据。这样我就可以更新视图了。
通常我没有遇到太多麻烦,但最近我看到我的服务器已经满足了数百个未答复的请求,我相信这个问题可能是因为其中一个请求延迟了。
如果每隔6秒请求一次的page1需要45秒响应(由于数据库查询速度慢等),那么在我看来,请求开始逐个堆叠。 如果我有多个用户同时连接到Web应用程序(或使用多个选项卡),事情可能会变坏。
有关如何避免此类问题的任何建议吗?
我在考虑使用ZMQ和Sockets.io in the client side之类的内容,但由于我要求的数据不会因任何用户操作而被解雇,我不会# 39;看看这是如何从服务器端触发的。
答案 0 :(得分:1)
我在考虑在客户端使用ZMQ和Sockets.io这样的东西......
这几乎绝对是长期运行请求的最佳选择。
...但由于我要求的数据不会被任何用户操作触发,我不知道如何从服务器端触发此操作。
在这种情况下,用户操作'问题是连接到socket.io服务器。此缩减示例取自socket.io getting started个文档之一:
var io = require('socket.io')(http);
io.on('connection', function(socket) {
console.log('a user connected');
});
当'连接'事件被触发,您可以开始侦听ZMQ消息队列上的消息。如有必要,您还可以启动长时间运行的查询。
答案 1 :(得分:0)
根据@epascarello的推荐,我最终解决了这个问题,如果我在X时间内没有得到任何响应,我会稍微改进一下。
如果请求未返回,请不要发送另一个请求。但修复服务器端代码并加快速度。
基本上我做了类似以下的事情:
var ELAPSED_TIME_LIMIT = 5; //5 minutes
var responseAnswered = true;
var prevTime = new Date().getTime();
setInterval(function(){
//if it was answered or more than X m inutes passed since the last call
if(responseAnsswered && elapsedTime() > ELAPSED_TIME_LIMIT){
getData()
updateElapsedTime();
}
}, 6000);
function getData(){
responseAnswered = false;
$.post("http://whatever.com/action.json", function(result){
responseAnswered = true
});
}
//Returns the elapsed time since the last time prevTime was update for the given element.
function elapsedTime(){
var curTime = new Date().getTime();
//time difference between the last scroll and the current one
var timeDiff = curTime - prevTime;
//time in minutes
return (timeDiff / 1000) / 60;
}
//updates the prevTime with the current time
function updateElapsedTime(){
prevTime = new Date().getTime();
}
答案 2 :(得分:-1)
这是一个非常糟糕的设置。如果可能,您应该始终避免轮询。而不是每6秒从客户端向服务器发送请求,而是将数据从服务器发送到客户端。您应该在服务器端检查数据是否有任何变化,然后使用websockets将数据传输到客户端。您可以在服务器端使用nodejs来监视数据中的任何更改。