环路上的简单PHP脚本导致服务器CPU过载

时间:2014-07-23 19:29:08

标签: php ajax loops overloading cpu

我在循环上有一个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过载有任何建议吗?

1 个答案:

答案 0 :(得分:0)

您拥有哪些服务器统计信息?我认为问题是,你有一个弱服务器的流量太多。当然,ajax调用的间隔时间也是1秒。检查你的控制台,你会发现他们中的大多数都会超时。

会话将是服务器端,因此它将使用服务器资源。如果要将脚本转换为cookie,则数据将存储在用户浏览器中。你也可以使用$ .cookie jQuery插件轻松地通过JS读取cookie,所以不需要ajax调用。

此外,除非制作一些高度安全的登录系统,否则我不建议使用会话。我建议使用memcache来存储临时数据。

另外,我非常确定你的JS可以使用优化,因为初看起来我没有看到你会检查一个ajax调用是否已经激活。所以在最后一次通话完成之前,它不会进行ajax通话。否则,您可以想象无意义的ajax调用进入服务器,其中50%的调用时间超时。