XHR长时间轮询聊天应用程序(而不是套接字)?

时间:2020-04-22 20:48:12

标签: php mysql ajax long-polling

我需要创建一个用户到用户的实时聊天系统。我设法为聊天创建了一个简单的AJAX / PHP / MySQL脚本,但在PHP / MySQL部分中让我担心的是:

while(true) {
    // ...SELECT * FROM messages ORDER BY date DESC LIMIT 1...

    if($row['date'] > $_POST['last']) {
        echo json_encode($row);

        break;
    }

    sleep(1);
}

这不是意味着它将每隔1秒SELECT表一次,并且不会使服务器超载吗?


我尝试使用PHP套接字,但这是一场噩梦。我还必须购买SSL证书,而且服务器在许多用户的测试中崩溃了,因此我决定暂时使用长拉系统。如果我没记错的话,Facebook在切换到套接字之前(如果根本没有切换)使用XHR长轮询。

1 个答案:

答案 0 :(得分:0)

嗯,您的问题太笼统了。尽管它主要取决于您将要接收的负载和服务器的详细信息,但通常不建议使用长时间轮询。

您的问题中有某些假设,这些假设根本不是真的。

我也必须购买SSL证书

是吗?据我所知,有免费的证书发行者,例如letsencrypt。这里的问题可能是您正在使用仅FTP访问的共享主机。考虑从某个云提供商处获得VPS,例如DigitalOcean。您将拥有在那里的虚拟环境的完全访问权限。而且大多数最便宜的VPS都以相同的价格提供共享托管。

Facebook在切换到套接字之前使用XHR长轮询

是的,他们曾经是,有时也回到他们身边。但是,首先-它们具有很大的计算能力。他们负担得起这些东西。其次,facebook网络聊天不是我用过的最快的应用程序:)

-

在正常的MySQL单实例上具有索引列和一些记录的情况下,您不会注意到任何变慢的情况。随着数据的增长,用户(同步连接)的增长,您将逐渐发现自己需要进行优化,最终有一天您将最终获得WebSocket的青睐。

PHP本质上并不意味着是异步的。所有异步事件以及整个事件循环,您都需要自己完成或组合几个框架来解决。

我通常会建议使用异步运行时的完整专有WebSocket实现。您可以查看Ratchet的{​​{1}}或PHP的{​​{1}}。