带sleep()的脚本正在减慢服务器速度,导致Apache崩溃

时间:2013-08-20 06:59:15

标签: php javascript ajax apache

我的网站在用户之间具有消息传递功能。当用户登录时,我使用jQuery.ajax()调用PHP脚本来检查新消息。为了减少请求,我的PHP脚本循环调用check_new_messages()函数,如果没有新消息,我在循环内调用sleep(5),这样它等待5秒然后继续循环。我使用microtime()检查脚本执行了多长时间,如果超过60秒,我返回0. ajax将收到此值,然后再次调用脚本。

function check_message_queue($user) {
    $response = 0;
    $msgs = 0;
    $time_start = microtime(true);

    while (!$msgs = check_new_messages($user)) {
        sleep(5);
        $time_end = microtime(true);
        if ($time_end - $time_start >= 60)
            return $response;
    }

    // has new messages
    sleep(5);
    return $response;
}

我的php.ini已将max_execution_time设置为120。

一开始一切正常,但是当我刷新页面时有大约10秒的延迟,有时我会得到PHP错误“超过30秒的最大执行时间”,然后Apache崩溃。我的PHP max_execution_time肯定设置为120秒,所以我不确定发生了什么。

我之前从未做过这样的事情,所以希望这只是我的一些不好的编码。

这是我的JavaScript:

var request_new_messages = function() {
    $.ajax({
        url: 'messages/checkqueue',
        type: 'post',
        contentType: 'application/x-www-form-urlencoded; charset=utf-8',
        data: { id: 0 },
        complete: function() { request_new_messages(); },
        error: function(jqXHR, textStatus, errorThrown) { handle_error(); },
        success:
            function(data, textStatus, jqXHR) {
                if (textStatus == "success") {
                    if (!isNaN(data)) {
                        var response = parseInt(data);
                        if (response > 0)
                            alert('You have ' + response + ' new messages.');
                    }
                }
            }
    });
};

2 个答案:

答案 0 :(得分:0)

你不应该真的使用PHP。如果您可以访问您的服务器,即它不是共享托管或类似的东西,请阅读有关nodejs和socket.io的信息。除此之外,一旦有人访问它,你每次都会暂停php。您的脚本每秒可以访问几次。想象一下,如果你有50个用户会发生什么。这可能会导致apache崩溃。你可以检查一下apache的日志,并在这里报告最后几行(我的意思是在崩溃之前)。

答案 1 :(得分:0)

为什么要让它在服务器上执行?

PHP和JS不是用于此类问题的最佳技术,但如果必须使用它们,则以下方法会更好:

每60秒(或您希望使用的任何其他合适的间隔)发出一个AJAX请求,检查一次并返回结果。

这里有关于消息传递系统最佳方法的大量问题/答案。右侧“相关”标签中的示例:

Best Way to Build a Web Based Instant Messaging?