长轮询超出最大执行时间

MAX EXECUTION TIME exceeded in long polling

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

如果我没有收到任何新消息,我正在制作脚本 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;}

    }
 ...

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

php pullmessage.php

(首先,我希望我正确理解了您的代码的用途。)

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

例如,如果您正在构建类似于 Whosebug 的 "recent inbox messages" 的功能,则可能由客户端 Javascript 代码实现, "sitting there waiting"(等待用户关闭页面)

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

回到 JS "solution"。 JS 代码会定期向某个 SO 服务器上的 PHP(?) 页面发送 AJAX 请求。 PHP 将开始,连接到数据库,获取请求的内容,将其发送回客户端,然后结束。然后JS会修改DOM,噗,'inbox'变成红色,数字加1。

这是一项繁重的工作,还有很多活动部件。但是我认为任务的initiation是在客户端开始的,而不是服务器端。

另请注意,一旦 PHP 消失,它就无法重新连接到客户端的网页。 AJAX 用于此目的,但适用于 "opposite direction".