COMET和PHP的解决方案

5
有没有一个真正的解决方案来实现COMET和PHP的组合?基本上,当数据库中有新数据时,我需要定期更新用户主页。据我所知,我需要在我的服务器和客户端浏览器之间打开一个持久连接,以便在有新信息可用时立即更新他们的主页内容,而不需要耗费大量资源,但是我没有找到任何清晰的关于这个问题的资料。我读了很多文章,建议PHP不是实现COMET的好语言。我的Web应用程序完全使用PHP编程,我不想学习另一种语言,但如果我被迫这样做,您会建议一个好的语言开始吗?您认为我可以编写一个界面来处理这个问题吗?谢谢。

重复:https://dev59.com/rXRB5IYBdhLWcg3wgHar - Jerod Venema
8个回答

2
我听过很多人说PHP不适合用于COMET (就像你自己说的),主要是因为Web服务器和PHP的工作方式--通常情况下每页有一个进程,这意味着如果您想让200个用户连接到您的服务器,您将需要200个进程(对于几百个更多的用户,这可能很快成为一个问题)。也许解决这个问题的方法是使用nginx_http_push_module?我还没有尝试过(但是呢?),但这可能正是我们所需要的...

有趣。是否有如何使用它的示例?例如,如何从 PHP 脚本将数据推送到浏览器? - codemaker
我还没有看到任何 PHP 的例子,不幸的是 ;-( ;; 也许有一天我会尝试,但不是在近期内... 不过,如果你自己尝试了,或者发现了任何有趣的东西,我对你所发现的内容很感兴趣 ;-) - Pascal MARTIN

1

我曾在学校项目中遇到同样的问题。由于每个PHP进程都有很多内存开销,所以无法支持太多连接。因此,我决定转而使用BOSHXMPP。这是一种相对较新的技术 "浪潮",但已经有相当多的库可以帮助你入门。我建议使用StropheXMPPHP。然后,您的客户端可以连接到BOSH服务器(我正在使用Openfire),这可以扩展到每个服务器数千个活动连接。


0

你不必学习一门新语言来实现这样的功能。

例如,你可以使用 Quercus(PHP 的 Java 实现)并利用 JVM 的内存管理模型实现服务器 Comet 应用程序。


很有趣听到有一个PHP在JAVA实现。根据我所读的文档,它比传统的PHP-APACHE模块更快,但我真的很困惑。据我所理解,Resin将服务于PHP页面而不是Apache,但是如何使用JVM实现Comet服务器应用程序,正如您所说?我应该利用一些JAVA函数吗?请原谅我,我是这项技术的新手,对JAVA毫无经验。谢谢。 - codemaker

0

非常感谢提供的信息。 我打算试一下。 - codemaker

0
你应该尝试使用Dmitry Koterov的Realplexor,它是一个comet服务器,提供Javascript和PHP API。 中提供了英文版的Readme.txt。

它在我的电脑上可用,你可以尝试从这个页面下载:http://github.com/DmitryKoterov/dklab_realplexor/ - Anton N

0

Ajax 长轮询是一种简单的解决方案,jQuery 和其他主要 JS 框架都有插件可以帮助你实现。


Comet是长轮询Ajax,PHP不允许您调整典型的页面/请求模型,因此使用Comet和PHP很难获得良好的结果。 - Michael

0

Node.js似乎是这种情况下一个相当不错的解决方案。(虽然对于生产来说还有点游戏化,但仍然很酷)。PHP对于这种情况来说是一个可怕的环境,因为你必须改变服务器与请求交互的方式,因为你不再立即响应。Python有一些像Twisted这样的服务器非常适合这种情况,因为它们让你成为服务器。无论你用什么语言编写,你都必须改变典型的请求/响应模型。(例如,Glassfish的Grizzly Comet服务器就可以为Java做到这一点)


0

首先,您需要了解什么是Comet应用程序。构建Comet应用程序所涉及的概念在维基百科上有解释,链接为Comet (programming)

您需要了解的是,只要遵循维基百科上解释的概念,就可以使用任何编程语言来构建Comet应用程序。

1. Ajax长轮询。

2.Streaming

您可以在简单的“长轮询”示例代码中查看一些示例代码。

现在来谈谈问题 -

1.如果您使用ajax长轮询,则浏览器(ajax请求)将继续轮询服务器以获取数据。这可能会耗尽服务器上的内存或在一段时间后减慢浏览器速度。

一些建议

JQuery PeriodicalUpdater(AJAX长轮询/服务器轮询)

处理长轮询

RobertFischer / JQuery-PeriodicalUpdater

您需要检查以下内容才能实施此操作 -

a)您期望服务器上的数据更新频率是多少。

b)服务器端脚本在发送数据到客户端之前运行多长时间以检查、获取和处理数据。

2.您可以通过使用以下方法来实现流 -

如何使用PHP实现COMET

Lightstreamer Dojo

Dojo Charting + Lightstreamer Comet演示

演示

Ajax Push Engine或APE项目

您需要检查以下内容 -

a)您的托管提供商是否允许您在托管服务器上安装这些软件

b)您的RAM和带宽利用率(您将需要一个专用服务器,以获得大量RAM和带宽的套餐)

这取决于您的需求是什么以及如何。 您需要进行分析和处理。

如果你正在实现的是一个小型应用程序,可以选择Ajax长轮询,前提是你已经分析并处理了这种方法的负面影响。
如果你有一个大型应用程序,可以选择流媒体。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接