我已经使用jquery和PHP为网站添加了聊天功能,它似乎通常运行良好,但我担心可扩展性。我想知道是否有人有一些建议。对我而言,关键领域是有效管理谁是谁的意识。
细节: 我还没有实现长轮询(还),我担心PHP(Apache)中长时间运行的进程的原始数量会失控。
我的代码运行一个定期的jquery ajax轮询(4secs),它首先更新数据库以表示我处于活动状态并设置时间戳。 然后有一个例程检查所有活动用户的时间戳,并将那些外部(10分钟)设置为非活动状态。 到目前为止,我的研究结果相当正常。但是,我认为如果我允许每个活动用户检查每个其他活动用户,然后每个人都更新数据库以启动非活动用户,那么我将获得重复工作,记录锁和不必要的服务器负载。
所以我已经实现了“清扫工”角色的想法。这只是在线用户之一,他继承了清理人员的角色。其他人只是检查是否存在“清扫器”(DB读取)并继续。如果他们检查时没有扫地机,他们会自己扫地(DB写自己的记录)。如果不止一个,请让自己“不清扫”,随意睡觉并再次检查。
我的理论是,这种方式只有一个用户定期在相关表上写几个记录的更新,其他人都在阅读或只是写自己的记录。 所以它工作正常,但问题可能是这个过程需要一些数据库读取,实际上可能效率低于让每个人像我提到的其他研究一样进行清理。
到目前为止,我已经有超过100个并发用户正常运行,但是客户希望扩展到几个100,甚至超过1,000,我不知道在这个阶段是否这个想法是好的。
是否有人知道这是否是一种好方法,是否可以扩展到数百名活跃用户,或者您是否可以推荐不同的方法?
除此之外,实际聊天消息的长轮询/彗星似乎很简单,我已经找到了一个很好的代码资源,但是有一些博客评论表明它对PHP和apache特别危险。活动线程等。使用usleep和session_write_close可以最大限度地减少影响。
对于数百名活跃用户而言,有没有人有任何PHP长轮询设置的实践经验,也许你可以放心吧!我真的希望将其迁移到node.js(没有经验)吗?
提前谢谢
贝
答案 0 :(得分:3)
我的建议是使用meteor框架来做这件事,这应该是非常简单的,即使你不是专家,然后只需通过iframe将这样的聊天加载到你的PHP网站。
它可以扩展,不会占用太多资源,而且我认为它将来会变得更好。
它肯定胜过PHP彗星解决方案和jquery&基于ajax超时的服务器调用。
我甚至相信你可以在github上或多或少找到一个只需要调整的完整解决方案。
但当然,在您实施之前请先阅读docs 。
如果您担心安全问题,请阅读security with meteor
答案 1 :(得分:2)
长轮询确实对PHP来说是灾难性的。 PHP始终以有限的并发进程运行,只要您优化尽可能快地处理每个请求,它就会扩展得很好。 长轮询和类似的解决方案将很快填满您的管道。
可以说,使用当前的工具,PHP对于这类东西来说根本就不是正确的技术。如果你坚持使用PHP,你可以试试ReactPHP,这是一个非常类似于NodeJS构建的PHP框架。 React的含义还在于,它可以作为一个单独的守护进程运行,而不是像apache这样的网络服务器。我对此的稳定性以及它的扩展程度没有任何经验,因此您必须自己进行测试。
如果你对javascript了解得很好,那么NodeJS并不难。 NodeJS + socket.io使用websockets编写聊天服务器和客户端变得非常容易。这将是我的建议。当我开始这样做的时候,我在几个小时内就有了一些不错的东西。答案 2 :(得分:2)
如果您想使用PHP保留应用程序堆栈,您希望聊天应用程序在您的实际Web应用程序(而不是iframe)中运行,并且您担心扩展实时基础架构,那么我建议您查看托管服务实时更新,例如我工作的Pusher。通过这种方式,托管服务可以为您处理实时基础架构的扩展,并让您专注于构建应用程序功能。
这样您只需要处理聊天消息请求 - 清理/验证内容 - 然后通过Pusher将信息推送到1000个已连接的客户端。
此处提供快速入门指南: http://pusher.com/docs/quickstart
我在realtime web tech guide上列出了托管服务的完整列表。