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

XHR long polling for chat application (instead sockets)?

我需要创建一个用户对用户的实时聊天系统。我设法为聊天创建了一个简单的 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 table 并且不会使服务器超载?


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

好吧,你的问题太笼统了。虽然这主要取决于您将接收的负载和服务器的具体情况,但通常不鼓励使用长轮询。

您的问题中有某些假设,但根本不完全正确。

I had to buy SSL certificate, also

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

Facebook was using XHR long polling before switching to sockets

是的,他们是,有时他们也会回到他们身边。但是,首先 - 他们拥有强大的计算能力。他们买得起这些东西。其次,Facebook 网络聊天不是我用过的最快的应用程序:)

-

在正常 MySQL 单个实例上使用索引列和一些记录,您不会注意到任何速度下降。当数据和用户(同时连接)增长时,你会逐渐发现你需要优化一些东西,总有一天你会得到 WebSocket 的青睐。

PHP 本质上并不意味着异步。所有异步事情以及整个事件循环都需要您自己完成或编写多个框架来进行救援。

我通常建议使用异步运行时的完整专有 WebSocket 实现。您可以查看 Ratchet 以获得 PHP 或使用 ws 获得 Node.js.