【发布时间】:2012-11-07 09:33:58
【问题描述】:
我使用 jquery 和 PHP 向网站添加了聊天功能,它似乎通常运行良好,但我担心可扩展性。我想知道是否有人有一些建议。我认为对我来说,关键领域是有效地管理对谁在线的意识。
详情: 我还没有实现长轮询(还),我担心 PHP (Apache) 中长时间运行的进程的原始数量会失控。
我的代码运行定期 jquery ajax 轮询(4 秒),它首先更新 db 以表示我处于活动状态并设置时间戳。 然后有一个例程检查所有活动用户的时间戳并将那些外部(10 分钟)设置为非活动用户。 从我目前的研究来看,这是相当正常的。但是,我担心如果我允许每个活动用户检查每个其他活动用户,然后每个人都更新数据库以启动非活动用户,那么我将得到重复的工作、记录锁定和不必要的服务器负载。
所以我已经实现了“清道夫”角色的想法。这只是其中一位在线用户,继承了清理人员的角色。其他人只是检查是否存在“清扫器”(数据库读取)并继续。如果他们检查时没有清扫器,他们就会让自己成为清扫器(DB 为自己的记录而写)。如果不止一个,让自己“不扫地”,随机睡一段时间,然后再检查一次。
我的理论是,这样只有一个用户定期向相关表上的多条记录写入更新,而其他人要么在阅读,要么只是在写入自己的记录。 所以它工作正常,但问题可能是该过程需要一些数据库读取,并且实际上可能不如我提到的其他研究那样让每个人都进行清理效率。
到目前为止,我已经有超过 100 个并发用户运行良好,但客户希望扩展到数百个,甚至超过 1,000 个,我不知道现阶段这个想法是否好。
有谁知道这是否是一种好方法,是否可以扩展到数百个活跃用户,或者您是否可以推荐一种不同的方法?
顺便说一句,实际聊天消息的长轮询/彗星看起来很简单,我找到了一个很好的代码资源,但是有几个博客 cmets 表明它特别是 PHP 和 apache 很危险。活动线程等。使用 usleep 和 session_write_close 将影响降至最低。
再一次,有没有人有为数百名活跃用户设置 PHP 长轮询的实际经验,也许你可以让我放心!我真的希望将其迁移到 node.js(没有经验)吗?
提前谢谢你
托尼
【问题讨论】:
标签: php jquery mysql chat comet