长轮询中超出了MAX执行时间

时间:2015-03-07 13:18:12

标签: php mysql ajax comet long-polling

我正在尝试使用长轮询从MySQL表中获取最新消息。

如果我没有收到任何新消息,我将制作脚本sleep() 10秒钟。

但在最糟糕的情况下,如果我没有收到 10分钟的任何新消息,则脚本会说max_execution_time已超出。

我将如何解决这个问题。任何人都可以说我出错了。

PS - 我现在至少不想使用Websockets。

pullmessage.php

    $notyetgot = true;
    $data_msg = mysqli_query($con,"SELECT * FROM messages WHERE  message_id>".$latest." ");
    $n  = mysqli_num_rows($data_msg);
    if($n > 0){$notyetgot=false;}
    while($notyetgot){
        sleep(10);

        $data_msg = mysqli_query($con,"SELECT * FROM messages WHERE message_id>".$latest." ");

        $n  = mysqli_num_rows($data_msg);       
        if($n > 0){$notyetgot = false;}

    }
 ...

2 个答案:

答案 0 :(得分:1)

(首先,我希望我能正确理解你的代码的目的。)

PHP旨在按需执行。一个请求进来,它简要地做了一些事情,然后就消失了。相反,让它坐在那里等待某事是错误的"。

例如,如果您正在构建类似于stackoverflow""最近的收件箱消息"的功能,那么可能是由客户端Javascript代码实现的,其中"坐在那里等待" (等待用户关闭页面)。

堆栈溢出令人印象深刻,它在页面上放置了多少信息,并且速度相当快。许多网站在不太复杂的网页上表现不佳。

回到JS"解决方案"。 JS代码会定期向某个SO服务器上的PHP(?)页面发送AJAX请求。 PHP将启动,连接到数据库,获取所请求的内容,将其发送回客户端,然后死掉。然后JS会修改DOM,poof,' inbox'变为红色,数字增加1。

它做了很多工作,还有许多活动部件。但我认为任务的启动在客户端而不是服务器上启动。

另请注意,一旦PHP消失,它就无法重新连接到客户端的网页。 AJAX服务于这个目的,但是在相反的方向上工作"。

答案 1 :(得分:0)

作为替代方案,您可以从shell运行脚本,其中max_execution_time默认为0(无限)。

php pullmessage.php