0

我有一个具有用户之间消息传递功能的网站。当用户登录时,我使用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.');
                    }
                }
            }
    });
};
4

2 回答 2

0

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

于 2013-08-20T07:08:12.083 回答
0

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

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

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

这里有很多关于消息传递系统的最佳方法的问题/答案。右侧“相关”选项卡中的示例:

构建基于 Web 的即时消息的最佳方式?

于 2013-08-20T07:18:44.727 回答