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

Php 带有sleep()的脚本正在减慢服务器速度,导致Apache崩溃,php,javascript,ajax,apache,Php,Javascript,Ajax,Apache,我有一个网站,在用户之间具有消息传递功能。当用户登录时,我使用jQuery.ajax()调用PHP脚本来检查新消息。为了减少请求,我的PHP脚本循环调用check\u new\u messages()函数,如果没有新消息,我在循环中调用sleep(5),以便它等待5秒钟,然后继续循环。我使用microtime()检查脚本执行了多长时间,如果超过60秒,我返回0。ajax将接收该值,然后再次调用脚本 function check_message_queue($user) { $respon

我有一个网站,在用户之间具有消息传递功能。当用户登录时,我使用
jQuery.ajax()
调用PHP脚本来检查新消息。为了减少请求,我的PHP脚本循环调用
check\u new\u 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;
}
My php.ini的
max\u execution\u 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.');
                    }
                }
            }
    });
};

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

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

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

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

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


服务器端睡眠是一件坏事,如果有多个config.ini来更改php的最大执行时间,请避免这样做。在其中一个示例中,您仍然将最大执行时间设置为30而不是120,因此您必须将其更改为120。另外,睡眠并不是你想做什么的最佳方式,睡眠是同步的,会冻结整个服务器。你知道,我有预感睡眠会冻结一切。您知道如何在不使用sleep()的情况下实现这一点吗?您使用PHP和Ajax进行即时消息传递(IM)有什么特别(强烈)的原因吗?(从您的实现来看,我相信您正在寻求IM解决方案)。如果IM是目标,那么XMPP是一个更好的方法。请看这里:它基本上是一个标准的消息传递系统,但我知道许多用户会像IM一样使用它。上面的脚本用于在用户收到新消息时提醒用户,或者在阅读同一消息线程时收到回复时更新消息。我不熟悉XMPP。这是可以在共享服务器上使用的吗?正在记录的错误如下:
在第81行的D:\\Web\\dev\\application\\classes\\Messages.php中超过了30秒的最大执行时间,请参考:http://127.0.0.1:8080/site/messages
您确定编辑了正确的php.ini文件吗?请将路径粘贴到您更改的文件,我编辑了phpinfo()中引用的php.ini文件。检查phpinfo()会显示最大执行时间为120,这是我设置的。我希望轮询是服务器端的原因是许多人会使用IM之类的消息传递。60秒太长,无法发送警报。这需要5秒钟的时间。