我需要创建一个用户到用户的实时聊天系统。我设法为聊天创建了一个简单的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长轮询。
答案 0 :(得分:0)
嗯,您的问题太笼统了。尽管它主要取决于您将要接收的负载和服务器的详细信息,但通常不建议使用长时间轮询。
您的问题中有某些假设,这些假设根本不是真的。
我也必须购买SSL证书
是吗?据我所知,有免费的证书发行者,例如letsencrypt
。这里的问题可能是您正在使用仅FTP访问的共享主机。考虑从某个云提供商处获得VPS,例如DigitalOcean
。您将拥有在那里的虚拟环境的完全访问权限。而且大多数最便宜的VPS都以相同的价格提供共享托管。
Facebook在切换到套接字之前使用XHR长轮询
是的,他们曾经是,有时也回到他们身边。但是,首先-它们具有很大的计算能力。他们负担得起这些东西。其次,facebook网络聊天不是我用过的最快的应用程序:)
-
在正常的MySQL单实例上具有索引列和一些记录的情况下,您不会注意到任何变慢的情况。随着数据的增长,用户(同步连接)的增长,您将逐渐发现自己需要进行优化,最终有一天您将最终获得WebSocket的青睐。
PHP本质上并不意味着是异步的。所有异步事件以及整个事件循环,您都需要自己完成或组合几个框架来解决。
我通常会建议使用异步运行时的完整专有WebSocket实现。您可以查看Ratchet
的{{1}}或PHP
的{{1}}。