PHP聊天活跃用户

Ton*_*son 6 php mysql jquery chat comet

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

detail:我还没有实现long-polling(还),我担心PHP(Apache)中长时间运行的进程的原始数量会失控.

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

所以我已经实现了"清扫工"的作用.这只是在线用户之一,他继承了清理人员的角色.其他人只是检查是否存在"清扫器"(DB读取)并继续.如果他们检查时没有扫地机,他们会自己扫地(DB写自己的记录).如果有多个,请自己"清扫",随意睡觉并再次检查.

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

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

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

另外,实际聊天消息的长轮询/彗星似乎很简单,我已经为代码找到了一个很好的资源,但是有一些博客评论表明它对PHP和apache特别危险.活动线程等.使用usleep和session_write_close可以最大限度地减少影响.

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

先感谢您

托尼

Eve*_*ert 2

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

可以说,就目前的工具而言,PHP 根本不是适合此类内容的技术。如果您坚持使用 PHP,您可以尝试ReactPHP,这是一个与 NodeJS 的构建方式非常相似的 PHP 框架。React 的含义还在于它应该作为单独的守护进程运行,而不是在 apache 等 Web 服务器内运行。我对此没有稳定性以及扩展性方面的经验,因此您必须自己进行测试。

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