我在循环上有一个AJAX调用,设置为1000毫秒。 PHP脚本很简单,它只是将一些信息(一个数字)放入一个会话变量中。昨天我收到了我的托管服务提供商(HostGator)发来的一封电子邮件,其中说明我在共享主机上使用了75%以上的CPU。查看日志后,我发现问题出在AJAX调用中。这是代码:
PHP(ajax.session.php):
<?php
session_start();
$movieID_e = $_POST['id'];
$state = trim(strtolower($_POST['status']));
if ($state == 'playing') {
if (empty($_SESSION[$movieID_e])) {
$_SESSION[$movieID_e] = 1;
}
else {
$_SESSION[$movieID_e]++;
}
}
echo $_SESSION[$movieID_e];
?>
使用Javascript:
function interval(func,wait,times){
var interv = function(w, t){
return function(){
if(typeof t === "undefined" || t-- > 0){
setTimeout(interv, w);
try{
func.call(null);
}
catch(e){
t = 0;
throw e.toString();
}
}
};
}(wait,times);
setTimeout(interv, wait);
};
var watched = (function() {
var executed = false;
return function () {
$.post('ajax.session.php',{id:'<?php echo encrypt($id); ?>',status:'none'},function(result) {
if (result == 1000) {
if (!executed) {
executed = true;
var highlightad = introJs();
highlightad.setOptions({
steps: [
{
element: '#advertisment1',
intro: 'test',
position: 'bottom'
},
{
element: '#advertisment2',
intro: 'test2',
position: 'left'
}
]
});
highlightad.start();
}
}
else {
executed = false;
return false;
}
});
};
})();
interval(function(){watched()},1000,3000);
JS的解释:
function interval() - &gt;替代setInterval(),取自thecodeship.com
功能观察() - &gt; AJAX请求提交上面显示的ajax.session.php。如果结果为1000,则会使用Intro.JS突出显示网站的一部分。
间隔(函数(){观看()},1000,3000); - &GT;重复观察()每1000毫秒,最多重复次数是3000次。
请注意,PHP脚本(ajax.session.php)也是由AJAX从另一个脚本调用的,每1000ms还有一个函数interval()。
我每秒使用interval()来计算视频播放器中过去的秒数。
您对如何使用以下脚本防止CPU过载有任何建议吗?
答案 0 :(得分:0)
您拥有哪些服务器统计信息?我认为问题是,你有一个弱服务器的流量太多。当然,ajax调用的间隔时间也是1秒。检查你的控制台,你会发现他们中的大多数都会超时。
会话将是服务器端,因此它将使用服务器资源。如果要将脚本转换为cookie,则数据将存储在用户浏览器中。你也可以使用$ .cookie jQuery插件轻松地通过JS读取cookie,所以不需要ajax调用。
此外,除非制作一些高度安全的登录系统,否则我不建议使用会话。我建议使用memcache来存储临时数据。
另外,我非常确定你的JS可以使用优化,因为初看起来我没有看到你会检查一个ajax调用是否已经激活。所以在最后一次通话完成之前,它不会进行ajax通话。否则,您可以想象无意义的ajax调用进入服务器,其中50%的调用时间超时。