6

我已经使用 jquery 和 PHP 向网站添加了聊天功能,它似乎通常运行良好,但我担心可扩展性。我想知道是否有人有一些建议。我认为对我来说关键领域是有效地管理对谁在线的意识。

详细信息:我还没有实现长轮询(还),我担心 PHP (Apache) 中长时间运行的进程的原始数量会失控。

我的代码运行定期 jquery ajax 轮询(4 秒),它首先更新 db 以表示我处于活动状态并设置时间戳。然后有一个例程检查所有活动用户的时间戳并将那些外部(10 分钟)设置为非活动用户。从我目前的研究来看,这是相当正常的。但是,我担心如果我允许每个活动用户检查每个其他活动用户,然后每个人都更新数据库以启动非活动用户,那么我将得到重复的工作、记录锁定和不必要的服务器负载。

所以我已经实现了“清道夫”角色的想法。这只是其中一位在线用户,继承了清理人员的角色。其他人只是检查是否存在“清扫器”(数据库读取)并继续。如果他们检查时没有清扫器,他们就会让自己成为清扫器(DB 为自己的记录而写)。如果有多个,让自己“不扫地”,随机睡一段时间,然后再检查一次。

我的理论是,这种方式只有一个用户定期更新相关表上的几条记录,而其他人要么在阅读,要么只是在写自己的记录。所以它工作正常,但问题可能是该过程需要一些数据库读取,并且实际上可能比让每个人都像我提到的其他研究一样进行清理效率低。

到目前为止,我已经有超过 100 个并发用户运行良好,但客户希望扩展到数百个,甚至超过 1,000 个,我不知道现阶段这个想法是否好。

有谁知道这是否是一种好方法,是否可以扩展到数百个活跃用户,或者您是否可以推荐一种不同的方法?

顺便说一句,实际聊天消息的长轮询/彗星看起来很简单,我找到了一个很好的代码资源,但是有几个博客评论表明它特别是 PHP 和 apache 很危险。活动线程等。使用 usleep 和 session_write_close 将影响降至最低。

再说一次,有没有人有为数百名活跃用户设置 PHP 长轮询的实际经验,也许你可以放心!我真的希望将其迁移到 node.js(没有经验)吗?

先感谢您

托尼

4

3 回答 3

3

我的建议是使用流星框架执行此操作,即使您不是专家,这也很简单,然后只需通过 iframe 将此类聊天加载到您的 PHP 网站中。

我想,它将是可扩展的,不会消耗太多资源,而且将来只会变得更好。

它肯定胜过 PHP comet 解决方案和基于 jquery 和 ajax 超时的服务器调用。

我什至相信你可以在 github 上或多或少地找到一个只需要调整的完整解决方案。

但是,当然,请在实施之前阅读文档。

如果您担心安全问题,请阅读使用流星的安全性

于 2012-11-19T12:56:13.757 回答
2

长轮询对于 PHP 来说确实是相当灾难性的。PHP 总是在有限的并发进程下运行,只要您优化以尽可能快地处理每个请求,它就会很好地扩展。长轮询和类似的解决方案将很快填满您的管道。

可以说 PHP 根本不适合这种类型的东西,目前的工具在那里。如果你坚持使用 PHP,你可以试试ReactPHP,它是一个 PHP 框架,与 NodeJS 的构建方式非常相似。React 的含义还在于它应该作为一个单独的守护进程运行,而不是在诸如 apache 之类的网络服务器中运行。我对它的稳定性以及它的扩展性没有经验,所以你必须自己进行测试。

如果你对 javascript 很熟悉,NodeJS 并不难学。NodeJS + socket.io使得使用 websocket 编写聊天服务器和客户端变得非常容易。这将是我的建议。当我开始使用它时,我在几个小时内就完成了一些不错的工作。

于 2012-11-19T16:12:03.323 回答
2

如果您想使用 PHP 保留您的应用程序堆栈,您希望聊天应用程序在您的实际 Web 应用程序(而不是 iframe)中运行并且您担心扩展您的实时基础架构,那么我建议您查看托管服务以获取实时更新,比如我为之工作的Pusher 。通过这种方式,托管服务为您处理实时基础架构的扩展,并让您专注于构建应用程序功能。

这样,您只需要处理聊天消息请求 - 清理/验证内容 - 然后通过 Pusher 将信息推送到 1000 个连接的客户端。

快速入门指南可在此处获得:http: //pusher.com/docs/quickstart

我的实时网络技术指南上有完整的托管服务列表。

于 2012-11-20T10:25:25.663 回答