【问题标题】:Simple PHP script on loop causing server CPU overload循环中的简单 PHP 脚本导致服务器 CPU 过载
【发布时间】:2014-07-23 19:29:08
【问题描述】:

我有一个循环 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() -> 替代 setInterval(),取自 thecodeship.com

functionwatched() -> AJAX 请求文件 ajax.session.php 如上所示。如果结果是 1000,那么它会使用 Intro.JS 突出显示网站的一部分。

interval(function(){watched()},1000,3000); -> 每 1000 毫秒重复 watch(),最大值。重复次数为3000次。

请注意,PHP 脚本 (ajax.session.php) 也由 AJAX 从另一个脚本调用,函数 interval() 每 1000 毫秒调用一次。

我每秒使用一次 interval() 来计算视频播放器中过去的秒数。

您对如何使用以下脚本防止 CPU 过载有任何建议吗?

【问题讨论】:

  • 会话如何存储在共享主机上?您发布的 PHP 脚本似乎不太可能导致任何类型的负载,即使您每秒调用 10 次也是如此。您如何通过查看日志确定这是问题的根源?
  • 我不确定您的意思,您始终可以在共享主机上使用会话。我不是指 PHP 错误日志,托管服务提供商向我发送了一个如下所示的文件:Open connections Current Site Requests: 204.129.55.79 [DOMAIN_NAME] /ajax.session.php --->repeating the upper text

标签: php ajax loops overloading cpu


【解决方案1】:

您有哪些服务器统计信息?我认为问题在于,对于弱服务器而言,您的流量过多。当然,ajax 调用的 1 秒间隔也太频繁了。检查您的控制台,您会发现它们中的大多数都会超时。

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

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

另外,我很确定您的 JS 可以使用优化,因为乍一看,我没有看到您会检查一个 ajax 调用是否已经处于活动状态。所以在最后一次调用完成之前它不会 ajax 调用。否则,您可以想象无意义的 ajax 调用会转到服务器,其中 50% 会超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2023-04-10
    • 2012-07-13
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多