【问题标题】:PHP chat active usersPHP 聊天活跃用户
【发布时间】: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


    【解决方案1】:

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

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

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

    我的realtime web tech guide 上有托管服务的完整列表。

    【讨论】:

    • 真的很有趣。谢谢你。我喜欢 pusher 的概念,并且已经阅读了一些文档,看起来相当简单。我可能会联系,但会先开始研究 nodejs。再次感谢。
    【解决方案2】:

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

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

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

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

    当然,在实施之前请阅读docs

    如果您担心安全问题,请阅读security with meteor

    【讨论】:

    • Meteor 处于早期 alpha 阶段;一开始是一个巨大的安全漏洞,对于大多数需求来说太神奇了。我认为任何刚开始使用这些东西的人都会更有能力掌握纯 nodejs,而不是流星。
    • 但除了这些陈述;这是一个有很多魔法的沉重框架。开发人员认为它是早期 alpha 的事实至少应该引起一些担忧。
    • 我认为安全是事后才想到的。应隐含访问限制,默认情况下应关闭所有访问,而不是相反。
    • 我理解开发者的感受;我对这个框架的架构类型有一种非常强烈的(健康的?)偏执狂。我坚持我的主要观点,为了编写安全的 Meteor 应用程序,你必须真正了解整个堆栈是如何工作的,我觉得这对新手来说是一个陷阱,因为它是如此简单、神奇和自动化。我毫不怀疑该系统的作者可以用它编写安全的应用程序。
    • 我看到了那句话,让我皱起了眉头。如果真正的安全研究人员同意这一点,我将立即退出并同意您一直都是正确的。众所周知,Meteor 过去存在安全问题,并因此而声名狼藉。这个对 Meteor 有既得利益的家伙声称与这个大胆的声明完全相反,而且几乎没有支持。作为一个有思想的人,你怎么能相信他会不偏不倚地发表这样的声明?
    【解决方案3】:

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

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

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

    【讨论】:

    • 谢谢。与我见过的许多 cmets 一样,NodeJS + socket.io 似乎是要走的路,假设我自己构建了这个。我不会再浪费时间涉足长轮询,我会避开!现在已经下载了节点和套接字并将涉足。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2013-11-12
    • 1970-01-01
    • 2020-12-06
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多